Git 高阶教程

在之前的两篇文章中,详细介绍了 Git 的入门和 Git 的底层数据结构。在掌握了 Git 的基本命令后,基本就可以使用 Git 进行版本管理了。

当然,如果你需要将 Git 使用的更强大以及更有效率。那么你就需要这篇文章。

上图是 Git 的关键流程流转图,本文内容按照 Git 的关键流程进行。

本地操作

在将修改的内容提交到远程仓库之前,我们所有的操作都在暂存区、工作区以及本地仓库之中进行。

首先我们先来理解一下分支和 HEAD。HEAD 通常执行当前分支的最后一次提交。也就是说 HEAD 指向本地仓库最新提交

比较工作区和暂存区的文件差异

比较所有文件:

1
$ git diff

比较单个文件:

1
$ git diff -- filename

比较暂存区和 HEAD 的文件差异

比较所有文件:

1
$ git diff --cached

或者

1
$ git diff --staged

比较单个文件:

1
$ git diff --cached -- filename

让暂存区恢复成与 HEAD 一样

恢复所有文件:

1
$ git reset HEAD

恢复部分文件:

1
$ git reset HEAD -- filenames

让工作区的文件恢复为暂存区一样

1
$   git checkout -- filename

缓存暂存区和工作区的内容

1
$ git stash

恢复并且保留缓存

1
$ git stash apply

恢复并且删除缓存

1
$ git stash pop

隔离不需要纳入到版本管理的文件

通过创建 .gitignore 文件,该文件中存储不需要纳入到版本管理的文件名称,可以使用正则表达式。

从 HEAD 中删除文件

1
$ git rm filename

查看不同 commit 的指定文件的差异

1
$ git diff commit1 commit2  -- filename

查看不同分支的指定文件的差异

1
$ git diff branch1 branch2 -- filename

修改最新的 commit 的 message

1
$ git commit --amend

修改旧的 commit 的 message

parentCommitId 是指要修改的 commit 的上一次 commit的哈希值。

1
$ git rebase -i parantCommitId

进入交互式界面后修改 pick 为 reward,然后修改 commit 的 message。

合并连续的 commit

1
$ git rebase -i parantCommitId

进入交互式界面后把需要合并的commit 的 pick 修改为 squash,然后合并 commit。

**删除最近几次 commit **

强制回到某一次 commit,该 commit 之后的 commit 会小时,commitId 为该commit 的哈希值。

1
$ git reset --hard  commitId

查看 Git 的提交历史

查看所有的提交历史:

1
$ git log

下面的命令表示查看最近的三次提交:

1
$ git log -n3

所有的 commit 只展示一行数据:

1
$ git log --oneline

图形化展示提交记录:

1
$ git log --graph

上述的命令都可以组合使用。

多人协作环境

不同的人修改了相同文件的不同区域或者不同的文件:

1
$ git merge otherBranch

不同的人修改了相同文件的相同区域

1
$ git pull

然后进行手动解决冲突。解决冲突后提交修改

1
$ git commit -am"Resolved conflict"

变更了文件名,并且其他人基于文件做出了修改

1
$ git pull

不同的人修改同一文件的文件名

手动处理,选择其中一个文件名,然后解决冲突,提交。

1
$ git commit -am"Resolved conflict"

集成分支

禁止向集成分支进行 git push -f 集成分支不能进行 git rebase 操作(修改历史)

(完)

参考文献:

  1. https://github.com/progit/progit2
  2. https://git-scm.com/docs

微信公众号

© 2018 ray