在git的使用过程中,常常会遇到一些不太常见的问题,在这里做简单的记录便于记忆、查阅。
将已被跟踪的文件移出git版本控制
工作目录下的文件按照跟踪状态可分为两类:
- 已跟踪,即纳入git版本控制的文件
- 未跟踪,未纳入git版本控制的文件
执行git status
,Untracked files
下的文件即为未跟踪的文件。或者执行git status -s
,显示??
的文件即为未跟踪的文件。
跟踪新文件很简单,即git add <file>
,那么如何取消对已跟踪文件的跟踪呢?答案是git rm --cached <file>
,这样即可在文件保留在工作区的情况下将之移出版本控制,此后最好将文件添加到.gitignore
中,避免再次执行git add .
时文件又被纳入版本控制。
git rm与rm
当使用git rm
删除文件时,git会删除该文件并且从git的索引(暂存区)中移除它。这意味着这个文件的删除会被纳入到git的版本历史中,且它会在下次提交时记录删除操作,也就是说,当别人拉取这次提交时,相应的文件会被删除,这与使用--cached
选项时的行为不同。
如果直接使用rm
删除文件,则这个删除操作不会被纳入git的版本历史中,除非执行git add
或git rm
git rebase与git merge
https://blog.csdn.net/u010698107/article/details/129000177
把feature
rebase到main
相当于在最新的main
的基础上从feature
基于main
创建起重做一遍feature
做过的所有更改。
1 | git checkout feature |
如果有冲突,
1 | git add <解决冲突后的文件> |
merge的用法:
1 | git checkout feature |
如果有冲突,
1 | git add <解决冲突后的文件> |
落后于远程分支的处理
本地已经commit
1.执行rebase操作,拉取远程更改并将你的本地更改重新应用到这些更改之上
1 | git pull --rebase origin feature |
2.解决冲突
1 | git add <解决冲突的文件> |
3.完成推送
1 | git push origin feature |
本地尚未commit
1.暂存本地更改。该命令的行为是暂存当前工作区的更改,并将工作区还原到最近一次commit
的状态。
1 |
|
2.拉取远程更新
1 | git pull origin feature |
3.恢复本地修改
1 | git stash pop |
4.解决冲突
1 | git add <冲突文件> |
5.提交修改并推送到远程分支
1 | git commit -m <commit_message> |
冲突究竟是什么
在发生冲突时,git会在冲突的文件中添加冲突标记<<<<<<<
、=======
和>>>>>>>
,此时需要手动解决冲突,然后执行git add <冲突文件>
。
在没有解决冲突,也就是冲突标记仍存在时,依然可以执行git add <冲突文件>
并继续merge
或rebase
,这样会把文件中的冲突标记当做对文件的更改保留下来;即使解决了冲突,没有执行git add <冲突文件>
,git也不会认为冲突解决了。
也就是说,git看有没有解决冲突不是看冲突标记在不在,是看你有没有git add
。
在解决完冲突以后执行git merge --continue
或git rebase --continue
后,会弹出一个文本编辑器让你写commit message
,这是正常的。其中有一句All conflicts fixed but you are still merging.
不是质问你为什么冲突都处理完了还merge
,而是说虽然冲突处理完了,但是你的merge
仍在进行,要在这里写完commit message
,写完自动commmit
以后才算完成。