0%

git二三事

在git的使用过程中,常常会遇到一些不太常见的问题,在这里做简单的记录便于记忆、查阅。

将已被跟踪的文件移出git版本控制

工作目录下的文件按照跟踪状态可分为两类:

  • 已跟踪,即纳入git版本控制的文件
  • 未跟踪,未纳入git版本控制的文件
    执行git statusUntracked 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 addgit rm

git rebase与git merge

https://blog.csdn.net/u010698107/article/details/129000177
featurerebase到main相当于在最新的main的基础上从feature基于main创建起重做一遍feature做过的所有更改。

1
2
3
git checkout feature
git fetch origin main
git rebase origin/main

如果有冲突,

1
2
git add <解决冲突后的文件>
git rebase --continue

merge的用法:

1
2
3
git checkout feature
git fetch origin main
git merge origin/main

如果有冲突,

1
2
git add <解决冲突后的文件>
git merge --continue

落后于远程分支的处理

本地已经commit

1.执行rebase操作,拉取远程更改并将你的本地更改重新应用到这些更改之上

1
git pull --rebase origin feature

2.解决冲突

1
2
git add <解决冲突的文件>
git rebase --continue

3.完成推送

1
git push origin feature

本地尚未commit

1.暂存本地更改。该命令的行为是暂存当前工作区的更改,并将工作区还原到最近一次commit的状态。

1
2

git stash

2.拉取远程更新

1
git pull origin feature

3.恢复本地修改

1
git stash pop

4.解决冲突

1
git add <冲突文件>

5.提交修改并推送到远程分支

1
2
git commit -m <commit_message>
git push origin feature

冲突究竟是什么

在发生冲突时,git会在冲突的文件中添加冲突标记<<<<<<<=======>>>>>>>,此时需要手动解决冲突,然后执行git add <冲突文件>
在没有解决冲突,也就是冲突标记仍存在时,依然可以执行git add <冲突文件>并继续mergerebase,这样会把文件中的冲突标记当做对文件的更改保留下来;即使解决了冲突,没有执行git add <冲突文件>,git也不会认为冲突解决了。
也就是说,git看有没有解决冲突不是看冲突标记在不在,是看你有没有git add
在解决完冲突以后执行git merge --continuegit rebase --continue后,会弹出一个文本编辑器让你写commit message,这是正常的。其中有一句All conflicts fixed but you are still merging.不是质问你为什么冲突都处理完了还merge,而是说虽然冲突处理完了,但是你的merge仍在进行,要在这里写完commit message,写完自动commmit以后才算完成。