Git个人及团队的使用总结
因为Git这个话题比较大,时间有限,所以本篇文章不会一次性写完,会定期不断更新。
一、Git撤销、回滚和变基
在未进行git push
前的所有操作,都是在本地仓库中执行的。我们暂且将本地仓库的代码还原操作叫做撤销,已进行git push
,即已推送到远程仓库中。我们将已被提交到远程仓库的代码还原操作叫做回滚。注意:对远程仓库做回滚操作是有风险的,需提前做好备份和通知其他团队成员!。不要通过rebase对任何已经提交到公共仓库中的commit进行修改。
1.1 Git中的三个文件管理概念
工作目录:你的文件系统中可见的文件,即使用git add
之前的文件
暂存区:在下一次commit后即将写入仓库的变更的索引,即对应git add
之后,git commit
之前的文件
仓库:存储文件并记录了文件的每次变更
1.2 对三个文件区的不同操作
对于不同地方,需要使用不同的命令,将工作恢复到你想要的状态
工作目录的文件
git checkout -- <filename>
舍弃工作目录中一个文件的修改,对git add
和git commit
之后的没有影响git checkout -- .
舍弃工作目录中全部文件的修改(新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去)
文件在暂存区
git reset HEAD <filename>
撤销在暂存区的文件git reset HEAD .
撤销在暂存区的所有文件
这些命令仅改变暂存区,如果还想撤销文件在本地的修改,还需要用git checkout <filename>
git commit到了本地分支、但没有git push到远程
git log
得到你需要回退一次提交的commit idgit reset --hard <commit id>
回到其中你想要的某个版git reset --hard HEAD
回到最新的一次提交git reset HEAD
此时代码保留,回到 git add 之前
如修改的文件已被git commit,但想再次修改不再产生新的commit,可以git add <filename>
,然后git commit --amend -m "message"
git rebase -i <startpoint> <endpoint>
其中-i
的意思是--interactive
,即弹出交互式的界面让用户编辑完成合并操作, <startpoint> <endpoint>
则指定了一个编辑区间 (两个commit id),如果不指定<endpoint>
,则该区间的终点默认是当前分支HEAD所指向的commit (注:该区间指定的是一个前开后闭的区间)。如果用git rebase -i <commit id>^
,需要注意最后的^号,意思是commit id的前一次提交。
想要删除某个commit,操作:在编辑框中删除相关commit,用pick <id>
,然后保存退出就删除了摸个commit。squash <id>
会合并到之前的commit
已经git push把修改推送到远程仓库
(1)通过git reset是直接删除指定的commit
git log
得到你需要回退一次提交的commit idgit reset --hard <commit id>
git push origin HEAD --force
强制推送一次,之前错误的推送就从远程仓库删除
(2)通过git revert是用一次新的commit来回滚之前的commit
git log
得到你需要回退一次提交的commit idgit revert <commit id>
撤销指定的版本,撤销也会作为一次提交进行保存git push origin master
提送到远程
git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;revert奇数次生效,偶数次又回到之前的修改状态。比如一个文件内容是a,那么修改为ab,revert后文件变成了a,如果再revert后文件又还原成ab了
- git reset是将HEAD指针指到指定提交,回到某次提交,该提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除