日常 git 操作踩坑点总结
No.1 在相同文件本地提交到远程以后,当修改过本地文件,再次提交如果没有git diff 的话,这时如果git commit 以及git push origin 到远程分支的话,这时远程的文件可能会有冲突
解答:
01、 当本地代码与远程存在冲突的时候,如果想push到远程,一般会携带冲突的代码到远程,即远程代码存在冲> 突,只要git pull 再重新解决即可
02、如果发现冲突时,本地已经有修改过的其他代码,只要git stash -u 将已经修改的代码暂存在本地,然后pull 解决冲突,最后git stash pop 将暂存的代码pop出来即可.
No.2 时间A,从master切出新分支,改动代码,此时同事将自己的其他业务线的代码合并到master,在提交到远程的时候发现有冲突,远程pr中发现有冲突,但是本地vscode中暂未发现有冲突的点,为何?如何解决?
解答:
01、原因: 本地自己的分支的改动是基于时间A下的master分支,而同事在合并master代码以后,远程master分支有改动,而本地没有,可理解为本地master分支低了远程master分支一个版本,故在本地看不到产生冲突的文件和代码
02、解决办法:将本地master与远程master保持同步,然后再将本地新分支 与master作合并即可看到冲突,最后解决冲突即可, 如下:
1 2
| git:(master) git pull origin master git:(fetature/A) git megre master
|
No.3 代码提交到远程后code review时发现提交了不必要的文件
解决办法:
找到那个文件的commit,然后将那个文件的commit还原到指定commit,再提交到远程即可
1 2 3 4 5 6
| git log + 文件A路径 git checkout + 指定commit + 文件A路径 git status git add + 文件A路径 git commit -m '' git push origin + 分支
|
No.4 如果将本地修改的A文件push到远程分支,后续又对该分支做过多次commit 和 push 操作,请问: 如何将该A文件回退到第一次提交前的版本而不影响整个分支的其他文件?
此部分解决方式与上面一致
No.5 如果误用git push origin + 分支名1 + 分支名 2 ,请问所push的以分支名1 为准还是分支名2为准
远程仓库中会存在两个分支,分别为分支名1和分支名2
No.6 在分支A下,不小心提交了要提交在分支B下的代码,如何解决?
将在分支A下的commit拿出来,然后再放在分支B上,即可
1 2
| (feature/A): git log + 分支A (提取commit) (feature/B): git cherry-pick + commit
|
No.7 20190403 git 错误操作
背景: 当时把所有的业务代码都写完了,看了pr,想优化下分支中的一些文件,就用了以下命令
1 2 3 4
| git status git log + 文件路径 // 查找到想要会退的commit,例如commit id 为 saasasa git reset -- hard saasasa git push -f origin + 本地分支名
|
问题: 直接导致远程代码被reset了,后提交的所有commit都不存在,导致代码数据全部都没有了,毁灭,难受,心塞,心慌
解决办法:
1 2 3
| git reflog show // 查找最近操作的head git reset + 想要回退的操作的headId git log // 即可看到上一次reset前的log
|
注释:例如我操作我本地的分支的一个 git reflog show
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| fc2310c9 (HEAD -> git/test) HEAD@{0}: checkout: moving from feature/optional-settlement to git/test 26284977 (origin/feature/optional-settlement, feature/optional-settlement) HEAD@{1}: reset: moving to HEAD 26284977 (origin/feature/optional-settlement, feature/optional-settlement) HEAD@{2}: checkout: moving from git/test to feature/optional-settlement fc2310c9 (HEAD -> git/test) HEAD@{3}: reset: moving to HEAD@{2} d730bc53 (origin/git/test) HEAD@{4}: reset: moving to HEAD@{0} d730bc53 (origin/git/test) HEAD@{5}: reset: moving to d730bc5333a6f0054227d9476dffb5dc5308f5e8 fc2310c9 (HEAD -> git/test) HEAD@{6}: commit: git测试 5d1965a0 (origin/master, origin/HEAD, master) HEAD@{7}: checkout: moving from master to git/test 5d1965a0 (origin/master, origin/HEAD, master) HEAD@{8}: checkout: moving from qatest to master 83eede1e (origin/qatest, qatest) HEAD@{9}: commit (merge): 合同 ed915fc5 HEAD@{10}: merge feature/remove-branch: Merge made by the 'recursive' strategy. f3d9ba99 HEAD@{11}: merge feature/customer-log: Merge made by the 'recursive' strategy. 26284977 (origin/feature/optional-settlement, feature/optional-settlement) HEAD@{12}: merge feature/optional-settlement: Fast-forward 5d1965a0 (origin/master, origin/HEAD, master) HEAD@{13}: checkout: moving from master to qatest 5d1965a0 (origin/master, origin/HEAD, master) HEAD@{14}: checkout: moving from qatest to master 8254f765 HEAD@{15}: reset: moving to HEAD 8254f765 HEAD@{16}: checkout: moving from feature/optional-settlement to qatest 26284977 (origin/feature/optional-settlement, feature/optional-settlement) HEAD@{17}: commit: 删除注 释 & 字段修改 2f3028b0 HEAD@{18}: commit: 选座优化
|
反思
01、git reset –hard 和 git push -f 和 git pull -f 这些强制性的操作太过于危险,最好不要使用,切勿在公共分支使用
02、如果想将某个提交过的文件回退,可以使用如下操作
1 2
| git log -- 文件路径 git checkout + commitId + 文件路径
|
03、对于分支强拉或者强推 ,最好不要使用 -force ,可以考虑使用 rebase 操作,不会重新生成 commitId, 操作比较柔和