Git 高阶教程
在之前的两篇文章中,详细介绍了 Git 的入门和 Git 的底层数据结构。在掌握了 Git 的基本命令后,基本就可以使用 Git 进行版本管理了。
当然,如果你需要将 Git 使用的更强大以及更有效率。那么你就需要这篇文章。
上图是 Git 的关键流程流转图,本文内容按照 Git 的关键流程进行。
本地操作
在将修改的内容提交到远程仓库之前,我们所有的操作都在暂存区、工作区以及本地仓库之中进行。
首先我们先来理解一下分支和 HEAD。HEAD 通常执行当前分支的最后一次提交。也就是说 HEAD 指向本地仓库的最新提交。
比较工作区和暂存区的文件差异:
比较所有文件:
$ git diff
比较单个文件:
$ git diff -- filename
比较暂存区和 HEAD 的文件差异:
比较所有文件:
$ git diff --cached
或者
$ git diff --staged
比较单个文件:
$ git diff --cached -- filename
让暂存区恢复成与 HEAD 一样
恢复所有文件:
$ git reset HEAD
恢复部分文件:
$ git reset HEAD -- filenames
让工作区的文件恢复为暂存区一样
$ git checkout -- filename
缓存暂存区和工作区的内容
$ git stash
恢复并且保留缓存
$ git stash apply
恢复并且删除缓存
$ git stash pop
隔离不需要纳入到版本管理的文件
通过创建 .gitignore 文件,该文件中存储不需要纳入到版本管理的文件名称,可以使用正则表达式。
从 HEAD 中删除文件
$ git rm filename
查看不同 commit 的指定文件的差异
$ git diff commit1 commit2 -- filename
查看不同分支的指定文件的差异
$ git diff branch1 branch2 -- filename
修改最新的 commit 的 message
$ git commit --amend
修改旧的 commit 的 message
parentCommitId 是指要修改的 commit 的上一次 commit的哈希值。
$ git rebase -i parantCommitId
进入交互式界面后修改 pick 为 reward,然后修改 commit 的 message。
合并连续的 commit
$ git rebase -i parantCommitId
进入交互式界面后把需要合并的commit 的 pick 修改为 squash,然后合并 commit。
**删除最近几次 commit **
强制回到某一次 commit,该 commit 之后的 commit 会小时,commitId 为该commit 的哈希值。
$ git reset --hard commitId
查看 Git 的提交历史
查看所有的提交历史:
$ git log
下面的命令表示查看最近的三次提交:
$ git log -n3
所有的 commit 只展示一行数据:
$ git log --oneline
图形化展示提交记录:
$ git log --graph
上述的命令都可以组合使用。
多人协作环境
不同的人修改了相同文件的不同区域或者不同的文件:
$ git merge otherBranch
不同的人修改了相同文件的相同区域
$ git pull
然后进行手动解决冲突。解决冲突后提交修改
$ git commit -am"Resolved conflict"
变更了文件名,并且其他人基于文件做出了修改
$ git pull
不同的人修改同一文件的文件名
手动处理,选择其中一个文件名,然后解决冲突,提交。
$ git commit -am"Resolved conflict"
集成分支
禁止向集成分支进行 git push -f
集成分支不能进行 git rebase 操作(修改历史)
(完)
参考文献: