目录
0. 前言
1. git stash: 暂时保存本地修改
2. git push时发生冲突怎么办?
3. 访问过去的提交版本:git checkout
3.1 detached HEAD
3.2 “detached HEAD”状态下所作的修改会怎样呢?
3.3 “detached HEAD”状态下所作的修改如何汇入开发branch?
4. 取消或恢复
4.1 git reset
4.2 git revert
4.3 git checkout
5. 创建bare repository
0. 前言
记录日常git使用过程中碰到的一些常见问题的解决,以及一些常用技巧。作为自己作为git使用者的从入门到进阶的成长过程。不求完备但求简洁实用。动态更新。。。
1. git stash: 暂时保存本地修改
多人工作的项目中,经常会碰到自己在本地做了一些修改(但是还没有经过验证,没有做好要提交的准备),这个远程库已经有更新,需要pull下来在这个最新版本基础上进行自己的修改的验证。这时,pull一下的话会碰到以下这种错误:
简而言之,就是因为本地有修改而且还没有commit(not yet being staged),所以git不允许你pull远程最新版本,因为它不知道该拿你本地修改的东西与远程版本中的更新怎么办。如果你本地commit了话,那么git会在pull时自动进行merge,如果merge时发生冲突,会在merge版本中留下标志。但是你本地修改没有commit,git就不知道该咋办了,干脆报警撂挑子不干了。
简单的对策(三板斧):
git stash
git pull
git stash pop
第一条命令是将本地修改暂时保存起来,这样本地版本就回到上一次pull下来的状态。这样的话,再执行第1条git pull命令就不存在冲突了。然后,第3条指令的意思是重新把刚才暂存起来的本地修改弹(pop)出来,再次patch到最新pull下来的最新版本上去。
那怎么确保在以上操作过程中自己原本所做的修改没有丢失呢?
在以上操作过程之前执行一下“git status”,然后在以上操作过程后再执行一次git status,两次git status所得到的结果应该一致,即应该都列举了本地修改过的文件有哪些。当然,更保险的做法是手动备份自己所作的本地修改,然后在执行以上操作之后,用diff进行手动备份文件与本地库中的文件确认自己所作的修改是否还在。
关于git stash的更全面的解说参见:git stash - Saving Changes | Atlassian Git Tutorial
2. git push时发生冲突怎么办?
执行git push时常常会碰到以下错误:
这是因为在你git pull之后在本地做了修改到现在要push上去的期间内,有其他人对远程git库做了修改。
最简单的解决方案就是,先执行“git pull”,将远程库的更新拉下来。这时由于本地的更新已经commit了,git在pull时会自动执行远程更新与本地更新的merge。
如果本地更新与远程更新没有冲突,比如说,没有针对相同的文件进行更新,那就只是平凡的merge,大家相安无事,执行完git pull后再次执行git push即可。
如果本地更新与远程更新存在冲突呢?。。。且听下回分解。
3. 访问过去的提交版本:git checkout
当想要访问既往历史版本时,可以使用git checkout命令。开发过程中经常会需要追溯历史版本去查找某个功能问题是从哪个历史版本开始导入的。
git checkout commit-id
这条命令会切换指定的commit-id。而commit-id可以用用git log命令进行查询,比如说:
git log
git log --oneline
--oneline选项是给出简洁的输出,将信息压缩到一行中输出。
执行以上命令后,就可以在恢复的该commit版本上做验证、修改等操作,这些操作仅对该commit有效,不会影响其它branch,比如说开发工作所在的主branch(main or master等)。
3.1 detached HEAD
通常来说,HEAD会指向某个branch。但是,当执行git checkout后,HEAD就不再指向任何branch,而是仅指向该commit。这就是所谓的“detached HEAD”状态,或者说游离状态。
在这个状态下,所作的修改无法提交到各开发branch中去。
要想从这个游离状态返回到开发状态(比如说进入该游离状态之前的branch)去,直接执行以下命令即可:
git checkout <branch-name> # 切换到某指定branch
比如说,如果是从main or master branch进入该游离状态的话,则可以执行以下命令回去:
git checkout main
3.2 “detached HEAD”状态下所作的修改会怎样呢?
coming soon...
3.3 “detached HEAD”状态下所作的修改如何汇入开发branch?
coming soon...
git checkout命令还有以下一些使用方式:
git checkout -b <branch-name> # 创建新的branch并切换到该branch
git checkout -- <file> # 放弃对指定文件的本地修改,恢复到本地版本库中的状态
4. 取消或恢复
4.1 git reset
4.2 git revert
4.3 git checkout
5. 创建bare repository
--> git: Linux中创建中心仓库(or 裸仓库:bare repository)
ref: Git Tutorials and Training | Atlassian Git Tutorial