日常 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, 操作比较柔和