首页 GIT 常用操作
文章
取消

GIT 常用操作

1. 配置

  • git config -l: 查看所有配置信息;
  • git config --global user.name "USERNAME": 设置用户名为 USERNAME;
  • git config --global user.email example@example.com: 设置用户邮箱为 example@example.com

在特定项目中使用其他配置时,去掉 --global,重新设置。

2. 取得项目的 Git 仓库

  1. git init: 在工作目录中初始化新仓库;
  2. git clone [url]: 从现有仓库克隆;
  3. git clone [url] PROJECT-NAME:从现有仓库克隆,并指定项目名称。

3. 记录每次更新到仓库

  1. git status: 检查当前文件状态;
  2. git add: 可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等;
  3. 文件.gitignore: 忽略某些文件。
    • 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
    • 可以使用标准的 glob 模式匹配。
    • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
    • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
  4. git diff: 查看尚未暂存的文件更新了哪些部分;
  5. git diff --cached: 看已经暂存起来的文件和上次提交时的快照之间的差异;
  6. git diff --staged: 同5,Git 1.6.1 及更高版本可使用;
  7. git commit: 提交更新;
  8. git rm FILE-NAME: 从暂存区移除,并删除制定文件;
  9. git rm --cached FILE-NAME: 从暂存区移除指定文件,文件会被保留;
  10. git mv file_from file_to: 文件改名;
  11. git log: 查看提交历史;
  12. git log -p -2: 显示最近两次更新,并展开显示提交的内容差异。

4. 分支

4.1 显示分支

  • git branch: 显示分支;
  • git branch -v: 显示分支,包含最后一次提交信息;
  • git branch --merged: 显示已经合并的分支;
  • git branch --no-merged: 显示未合并的分支。

4.2 新建分支

  • git checkout -b iss53: 新建分支 iss53 并切换到此分支上,它是下面两条命令的简写:
    1. git branch iss53: 新建分支 iss53;
    2. git checkout iss53: 切换到分支 iss53

4.3 切换分支

  • git checkout iss53: 切换到分支 iss53

4.4 合并分支

hotfix 分支合并至 master 分支:

  1. git checkout master: 切换到 master 分支;
  2. git merge hotfix: 合并;
  3. git branch -d hotfix: 删除 hotfix 分支。

4.5 撤销合并

修复引用

git reset --hard HEAD~: 在 get merge 之后使用此命令,被合并的两个分支的指针会回到合并前的状态。

对于只存在于本地仓库中的合并来说,使用这个命令会很方便。但是它会重写历史,在一个共享仓库中会造成问题。

还原提交

git revert -m 1 HEAD: topic 分支合并至 master 分支后,使用此命令会生成一个新提交,该提交会撤销前一个合并产生的修改。

注:

  1. -m 1 标记指出 mainline 需要被保留下来的父结点。1 号节点为合并前 master 分支所在节点;2号节点则为 topic
  2. 还原提交后,再使用 git merge topic,时会提示 Already up-to-date.,因为此时 topic 分支为 master 分支的父节点。
    如果想把 topic 分支上的内容再合并到 master,应使用 git revert [commit] 还原上一次还原。其中 [commit] 为还原提交的 SHA1 ID

4.6 删除分支

  • git branch -d hotfix: 删除 hotfix 分支(用于删除已被 merged 的分支);
  • git branch -D hotfix: 强制删除 hotfix 分支。

5. 远程仓库

  • git remote: 列出所有远程主机;
  • git remote -v: 列出所有远程主机及其网址;
  • git remote add <主机名> <网址>: 添加远程主机,如 git remote add origin git@github.com:nxjniexiao/test.git

5.1 git fetch

git fetch 命令用于从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并。

如果要同步你的工作,运行 git fetch origin 命令。 这个命令查找 "origin" 是哪一个服务器(在本例中,它是 git.ourcompany.com),从中抓取本地没有的数据,并且更新本地数据库,移动 origin/master 指针指向新的、更新后的位置。

get fetch --all: 抓取所有远程仓库。

5.2 git pull

git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令。 如果有一个像之前章节中演示的设置好的跟踪分支,不管它是显式地设置还是通过 clonecheckout 命令为你创建的,git pull 都会查找当前分支所跟踪的服务器与分支,从服务器上抓取数据然后尝试合并入那个远程分支。

git pull <远程主机名> <远程分支名>:<本地分支名>: 取回远程主机某个分支的更新,再与本地的指定分支合并。
git pull origin next:master 表示:取回origin主机的next分支,与本地的master分支合并。

5.3 跟踪分支

命令: git checkout -b [branch] [remotename]/[branch]

从一个远程跟踪分支检出一个本地分支会自动创建所谓的跟踪分支。跟踪分支是与远程分支有直接关系的本地分支。 如果在一个跟踪分支上输入 git pull,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。

当克隆一个仓库时,它通常会自动地创建一个跟踪 origin/mastermaster 分支。

git checkout -b serverfix origin/serverfix 会创建一个本地分支 serverfix ,并且起点位于 origin/serverfix。本地分支和远程分支同名时,可以使用如下命令:

1
git checkout --track origin/serverfix

: 使用 git checkout serverfix 时,如果本地没有此分支,且远程仓库里有,我们会得到和上述两个命令相同的结果。

git branch -u origin/serverfix: 添加、修改跟踪分支,-u origin/serverfix--set-upstream-to=origin/serverfix 的简写。

git branch -vv: 查看设置的所有跟踪分支。

5.4 推送到远程仓库

git push [remote-name] [branch-name]: 当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字),那么运行这个命令就可以将你所做的备份到服务器:

1
$ git push origin master

git push origin --delete serverfix: 删除远程仓库 originserverfix 分支。

6. 变基

在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase

6.1 常规用法

1
2
3
          A---B---C topic
         /
    D---E---F---G master

使用 git merge master topic 合并后:

1
2
3
          A---B---C topic
         /         \
    D---E---F---G---H master

使用 git rebase master topicgit checkout topic + git rebase master)变基后:

1
2
3
                  A'--B'--C' topic
                 /
    D---E---F---G master

6.2 –onto 选项

1
2
3
4
5
    o---o---o---o---o  master
         \
          D---E---F---G---H  next
                           \
                            A---B---C  topic

假设你希望将 topic 中的修改合并到主分支并发布,但暂时并不想合并 next 中的修改,因为它们还需要经过更全面的测试。

这时,你就可以使用 git rebase 命令的 --onto 选项,选中在 topic 分支里但不在 next 分支里的修改(即 D-H ),将它们在 master 分支上重放(git rebase --onto master next topic):

1
2
3
4
5
    o---o---o---o---o  master
        |            \
        |             A'--B'--C'  topic
         \
          D---E---F---G---H  next

7. 撤销

7.1 重新提交

比如 commit 后发现漏掉了一个文件,则可以进行如下操作:

1
2
3
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

第二次提交将代替第一次提交的结果。

8.2 取消暂存文件

  • git reset HEAD <file>...: 取消暂存文件;

8.3 撤销对文件的修改

  • git checkout -- <file>...: 丢弃工作目录中的更改(危险命令)。
本文由作者按照 CC BY 4.0 进行授权