Git 使用注意事项
Git是一款优秀的版本管理的工具。
基本命令及其用法
git merge 合并分支,将目标分支合并到当前分支
git fetch 更新远端分支,但不会merge到本地
git pull 更新远端分支并merge到本地
git clone 从远程仓库拉取代码
git checkout 切换分支,-b 如果分支不存在则创建
git branch 查看分支, -help查看多种用法
git revert [commit id] 撤销制定commit ID带来的更改,并且重新生成一个commit
git reset [commit id] 复位commit ID,将head指针指向制定commit ID,常用参数有四个
parameter
|
Explanation
|
---|---|
--Soft |
Files won't change, differences will be staged for commit. |
--Mixed | Files won't change, differences won't be staged. |
--Hard | Files will be reverted to the state of the selected commit. Warning: any local changes will be lost. |
--Keep | Files will be reverted to the state of the selected commit, but local changes will be kept intact |
修改回退操作
通过 git checkout --[fileName/.(当前目录所有文件)] 命令可以撤销文件在工作区的修改。
通过 git reset [fileName/.(当前目录所有文件)] 命令可以撤销指定文件的 git add 操作,即这个文件在暂存区的修改。
git cherry-pick [commit id],commit Id来自于其他分支,如果出现冲突,需要手动解决,生成一个新的commit在当前分支最新提交后面。
git rebase 变基 base英文意为重新以...为根基,顾名思义是将当前的commit重新放到一个新的分支上。git rebase一般有下面两个用法
1. 更新其他分支变更到自己的分支
如果存在master,dev两个分支,且dev落后于master,现在希望把master最新的改动同步到dev,不使用merge操作,那么可以使用rebase命令,可以减少多余的commit记录,使得提交记录更加清爽。执行rebase命令所在的分支是需要移动的分支,如下图,feature1是以master1为基础切换过来,在feature1分支上进行git rebase master后,feature1的“base”变为了master4,之后切换到master进行merge操作,这个merge是fast-forward模式。这也就是rebase的效果。
注意:只有当feature1还未push到远端,才会有下面右图的效果。如果已经提交到远端,再次进行pull操作时候,仍然会产生一个merge commit。
2. 合并commit
git rebase -i HEAD~n n代表squash多少个commit
git rebase -i [your commit id] [your commit id]代表你所要squash的一串commit最远一次提交的上一次提交commit
git rebase -i [startpoint] [endpoint] 前开后闭区间,squash的commit时间范围 [startpoint] < range <= [endpoint]
操作注意事项
"If you follow this guideline, you’ll be fine. If you don’t, people will hate you, and you’ll be scorned by friends and family."
- push之前先pull(自动合并,如果有冲突需要手动解决)
- 如果只是希望看到远端最新代码,使用fetch 命令,并且在本地手动merge并解决冲突(如果有的话)
- 如果本地有文件还在暂存区,请先本地commit,然后进行pull操作,否则如果存在冲突并解决后,希望回退到自己的代码,则无法实现,所以commit一次就很重要,给git提供一个回退的commit id.
- 如果希望回退到之前的某个commit id,请使用revert操作(可能需要多次),这样commit时候会产生一个新的commit,可以看出此地曾经存在一个回退。当然如果知道自己在回退操作,也可以使用reset,推送到远程仓库需要git push -f操作,但是你需要确定在commit时间和执行push操作的之间时间段,没有其他人提交新代码,否则不要这么做。
- 多人协作时候推荐merge而不推荐rebase,除非开发分支只有一个开发人员才可以考虑使用rebase。
- 使用git rebase进行squash时候,只对本地的commit进行操作,不要对已经push的commit操作,因为需要进行git push -f,但是这样会覆盖别人的提交,有很大风险,同时也会生成新的merge commit,反而效果上适得其反。
- push自己的commit之前,先考虑下是否需要合并commit,进行squash,不要一个commit只涉及到一个无关紧要的修改。可以随时commit,不要随时push。
- git merge操作时候如果自动解决冲突的情况下,commit的提交信息是很标准的,如果需要手动解决冲突,提交信息要记录为[source branch]merge to [target branch]: [your message],不可遗漏branch信息,以后回溯时候不太好查看。
- 如果希望在更新远端代码时候,不愿意生成一个merge commit,那么可以在git pull加上–rebase参数,是得本地分支变基到远端最新commit上。
对于我来说,如果是自己一个人的开发分支,那么上述的很多命令都可以随意使用,是自己的分支更加清晰整洁,如果是和其他人的协作分支,最好老老实实的git merge!
参考书目 在线git教程