Git个人及团队的使用总结

因为Git这个话题比较大,时间有限,所以本篇文章不会一次性写完,会定期不断更新。

一、Git撤销、回滚和变基

在未进行git push前的所有操作,都是在本地仓库中执行的。我们暂且将本地仓库的代码还原操作叫做撤销,已进行git push,即已推送到远程仓库中。我们将已被提交到远程仓库的代码还原操作叫做回滚注意:对远程仓库做回滚操作是有风险的,需提前做好备份和通知其他团队成员!不要通过rebase对任何已经提交到公共仓库中的commit进行修改

1.1 Git中的三个文件管理概念

Git个人及团队的使用总结
工作目录:你的文件系统中可见的文件,即使用git add之前的文件
暂存区:在下一次commit后即将写入仓库的变更的索引,即对应git add之后,git commit之前的文件
仓库:存储文件并记录了文件的每次变更

1.2 对三个文件区的不同操作

对于不同地方,需要使用不同的命令,将工作恢复到你想要的状态
Git个人及团队的使用总结Git个人及团队的使用总结

工作目录的文件

git checkout -- <filename> 舍弃工作目录中一个文件的修改,对git addgit commit之后的没有影响
git checkout -- . 舍弃工作目录中全部文件的修改(新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去)

文件在暂存区

git reset HEAD <filename> 撤销在暂存区的文件
git reset HEAD . 撤销在暂存区的所有文件

这些命令仅改变暂存区,如果还想撤销文件在本地的修改,还需要用git checkout <filename>

git commit到了本地分支、但没有git push到远程

git log 得到你需要回退一次提交的commit id
git 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个人及团队的使用总结

已经git push把修改推送到远程仓库

(1)通过git reset是直接删除指定的commit

git log 得到你需要回退一次提交的commit id
git reset --hard <commit id>
git push origin HEAD --force 强制推送一次,之前错误的推送就从远程仓库删除

(2)通过git revert是用一次新的commit来回滚之前的commit

git log 得到你需要回退一次提交的commit id
git 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之后的修改都会被删除