git

GIT

分布式版本控制系统, 跟踪并管理修改而非文件

1. 配置

git config --global user.name "your name"
git config --global user.email "email.@example.com"

  • 文件添加到本地仓库 git add(工作区添加到暂存区)

    git add readme.txt

  • 文件提交到本地仓库 git commit(暂存区提交到版本库)

    git commit -m "wrote a readme file"

  • 仓库当前状态

    git status

  • 查看不同 git diff

    git diff readme.txt

  • 查看提交日志 git log
    git log (--pretty=online)

  • 回退(未 push 到远程仓库,只针对本地仓库)

    git reset -- hard HEAD^
    回退到上一个版本,HEAD 为当前版本,上一版本则是 HEAD^, 上上一版本则是 HEAD^^

git reset --hard 3628165
3628165 为你需要回退的版本号,可通过 git log 查看,版本号不需要写全,只需前几位即可,但一定要唯一

git checkout -- [文件]
说明:git checkout readme.txt, 将 readme.txt 在工作区的修改全部撤销
情况一:还未 git add, 则回退到版本库一模一样
情况二:已经 git add, 则回退到暂存区的状态
针对二:git reset HEAD readme.txt 可以把暂存区的修改撤销掉(unstage),重新放回工作区

  • 查看自己的每一次命令

    git reflog

  • 删除

    git rm

2. github 建立远程仓库

  • 第 1 步:创建 SSH Key。在用户主目录下,看看有没有.ssh 目录,如果有,再看看这个目录下有没有 id_rsa 和 id_rsa.pub 这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开 Shell(Windows 下打开 Git Bash),创建 SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
  • 第 2 步:登陆 GitHub,打开“Account settings”,“SSH Keys”页面
    然后,点“Add SSH Key”,填上任意 Title,在 Key 文本框里粘贴 id_rsa.pub 文件的内容

  • 第 3 步:建立本地库和 github 的链接

    新建库

echo "# smart4j" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/admin-wl/smart4j.git
git push -u origin master

已有库和 github 的链接

git remote add origin https://github.com/admin-wl/smart4j.git
git push -u origin master

使用命令 git push -u origin master 第一次推送 master 分支的所有内容
使用命令 git push -u origin master 第一次推送 master 分支的所有内容

  • 克隆

    git clone 地址

3. 分支

  • 创建并切换分支(git checkout -b [分支名])

    git checkout -b dev
    -b 参数表示创建并切换,相当于以下两条命令

    git branch dev
    git checkout dev
    
  • 创建分支

    git branch [name]

  • 切换分支

    git checkout [name]

  • 查看当前分支

    git branch

  • 合并指定分支分支到当前分支(git merge [指定分支名])

    git merge dev
    说明: 为 fast forward 合并,看不出来曾经做过合并。

git merge --no--ff -m "test" dev
说明: 合并分支时,加上 --no-ff 参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并。

  • 删除分支

    git branch -d dev

  • 查看分支合并图

    git log --graph

4. 解决 bug 方法

git stash 当前工作现场“储藏”起来,等以后恢复现场后继续工作
恢复 stash
一是用 git stash apply 恢复,但是恢复后,stash 内容并不删除,你需要用 git stash drop 来删除;
另一种方式是用 git stash pop,恢复的同时把 stash 内容也删了

  • 强行删除未合并的分支

    git branch -D

  • 查看远程仓库信息

    git remote

  • 创建远程 origin 的 dev 分支到本地

    git checkout -b dev origin/dev

  • 把最新的提交从 origin/dev 抓下来

    git pull

5. 多人合作

  • 查看远程库信息,使用 git remote -v;
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  • 从本地推送分支,使用 git push origin branch-name,如果推送失败,先用 git pull 抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用 git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用 git branch --set-upstream branch-name origin/branch-name;
  • 从远程抓取分支,使用 git pull,如果有冲突,要先处理冲突。

6. 标签

  • 命令 git tag 用于新建一个标签,默认为 HEAD,也可以指定一个 commit id;
  • git tag -a -m "blablabla..." 可以指定标签信息;
  • git tag -s -m "blablabla..." 可以用 PGP 签名标签;
  • 命令 git tag 可以查看所有标签。
  • 命令 git push origin 可以推送一个本地标签;
  • 命令 git push origin --tags 可以推送全部未推送过的本地标签;
  • 命令 git tag -d 可以删除一个本地标签;
  • 命令 git push origin :refs/tags/ 可以删除一个远程标签。

7. 搭建 git 服务器

  • 第一步,安装 git:

    $ sudo apt-get install git

  • 第二步,创建一个 git 用户,用来运行 git 服务:

    $ sudo adduser git

  • 第三步,创建证书登录:

    收集所有需要登录的用户的公钥,就是他们自己的 id_rsa.pub 文件,把所有公钥导入到 /home/git/.ssh/authorized_keys 文件里,一行一个。

  • 第四步,初始化 Git 仓库:

    先选定一个目录作为 Git 仓库,假定是 /srv/sample.git,在 /srv 目录下输入命令:
    $ sudo git init --bare sample.git

  • 第五步,禁用 shell 登录

    编辑 /etc/passwd 文件完成。找到类似下面的一行:
    git❌1001:1001:,,,:/home/git:/bin/bash
    改为:
    git❌1001:1001:,,,:/home/git:/usr/bin/git-shell
    这样,git 用户可以正常通过 ssh 使用 git,但无法登录 shell,因为我们为 git 用户指定的 git-shell 每次一登录就自动退出。

  • 第六步,克隆远程仓库