git 使用错误的问题

2017-06-29 14:21:06 +08:00
 yatesun

可能是我 git 用法或者使用错误问题,请大家指教。

第一次遇到这种情况,谢谢大家。

git 提交记录是这样的,隐去了一些关键信息

commit 4c440672c42395128054d5dbcfaabeabe132339d
Author: user1
Date:   Thu Jun 22 17:54:16 2017 +0800

    版本 2

commit d55b649a37343fb65207cf8343ef5c21e6de32de
Merge: 67f3d92 abee8a4
Author: myself
Date:   Wed Jun 21 12:01:32 2017 +0800

    Merge branch 'master' of http://192.168.1.2/git

commit 67f3d9281992e865a35efdf02c1aff8d7e85a1b2
Author: myself
Date:   Wed Jun 21 12:01:26 2017 +0800

    版本 1

通过

git show 4c440672c42395128054d5dbcfaabeabe132339d --stat

看到修改了

/admin/a.html
/admin/b.html
2 files changed, 1966 insertions(+), 1 deletion(-)

通过

git diff d55b649a37343fb65207cf8343ef5c21e6de32de 4c440672c42395128054d5dbcfaabeabe132339d --stat

看到修改了

/admin/a.html
/admin/b.html
/admin/c.html
3 files changed, 2026 insertions(+), 140 deletions(-)

两次不一致,而且 67f3d928 版本新增的内容,在 git 提交日志是能看到的,但从 d55b649 到 4c44067 的过程中,这个内容丢失了,而且 git show 没有看到修改记录。

2380 次点击
所在节点    git
21 条回复
yatesun
2017-06-29 14:23:18 +08:00
就是我提交的内容,被同事覆盖了,但是却没有在 git 提交历史中看到他的修改,或者有可能他也不知道他覆盖了我修改的部分。
GGGG430
2017-06-29 14:29:58 +08:00
Merge: 67f3d92 abee8a4 这部分 log 在 master 上, 你当前应该不在 master
yatesun
2017-06-29 14:33:19 +08:00
@GGGG430 我执行了 git branch,确实是 master 分支,而且这个 git 比较特殊,本身就没有任何其他分支。
yatesun
2017-06-29 14:34:35 +08:00
@GGGG430

git branch -a

* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
GGGG430
2017-06-29 14:39:14 +08:00
如果时在 master 分支的话, merge 应该是你在 commit 之前没有 pull, 然后 push 提示需要 pull 产生的;
GGGG430
2017-06-29 14:40:37 +08:00
git log --all --graph --pretty=format:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative 把这个的提交记录拿出来看看
yatesun
2017-06-29 14:41:36 +08:00
@GGGG430
对的
我一般是修改完代码之后
git pull
git commit -am "编辑内容"
git push

但有时候 git pull 的时候,提示有冲突,要先 commit,于是就是
git pull
git commit -am "编辑内容"
git pull
git push
GGGG430
2017-06-29 14:44:12 +08:00
@yatesun 我有过一段时间, 如果 commit 之前 pull 也有冲突, 我会先把冲突的本地文件 checkout/stash, 然后 pull, 尽量避免产生 merge, 这样查 log 时就比较好看, 就看你有没有洁癖了哈哈
yatesun
2017-06-29 14:45:52 +08:00
@GGGG430
* 3b9e834 - 减少并发几率。 (6 days ago) <user1>
* b938bf7 - 测试 (7 days ago) <user1>
|\
| * d55b649 - Merge branch 'master' of http://192.168.1.2/git (8 days ago) <yatesun>
| |\
| | * abee8a4 - (tag: v1.0.0.108) 修改 (2 weeks ago) <qiang>
| | * ca97d96 - (tag: v1.0.0.107) 调整网络 (2 weeks ago) <qiang>
| | * f97817c - 发版系统程序包名 (2 weeks ago) <qiang>
| * | 67f3d92 - 版本 1 (8 days ago) <yatesun>
* | | 4c44067 - 版本 2 (7 days ago) <user1>
| |/
|/|
* | 59dd567 - (tag: v1.0.0.106) RPC (2 weeks ago) <qiang>
yatesun
2017-06-29 14:46:31 +08:00
@GGGG430 是个好方法,我也是有洁癖的。
yatesun
2017-06-29 14:46:49 +08:00
@GGGG430 现在就是想找找原因,不重蹈覆辙
GGGG430
2017-06-29 14:48:15 +08:00
| | * abee8a4 - (tag: v1.0.0.108) 修改 (2 weeks ago) <qiang>
| | * ca97d96 - (tag: v1.0.0.107) 调整网络 (2 weeks ago) <qiang>
| | * f97817c - 发版系统程序包名 (2 weeks ago) <qiang>
| * | 67f3d92 - 版本 1 (8 days ago) <yatesun>
GGGG430
2017-06-29 14:48:45 +08:00
Merge: 67f3d92 abee8a4
你看在这之前的 log 都有的
yatesun
2017-06-29 14:51:36 +08:00
@GGGG430 那是什么问题
GGGG430
2017-06-29 14:52:58 +08:00
详细点说就是:
| * | 67f3d92 - 版本 1 (8 days ago) <yatesun>
这个人在 commit + push 时本地处于这个点, 然后将
| | * abee8a4 - (tag: v1.0.0.108) 修改 (2 weeks ago) <qiang>
| | * ca97d96 - (tag: v1.0.0.107) 调整网络 (2 weeks ago) <qiang>
| | * f97817c - 发版系统程序包名 (2 weeks ago) <qiang>
这些 pull merge, 然后再提交成功的
yatesun
2017-06-29 14:57:14 +08:00
@GGGG430 对呀,然后呢。
我 git reset --hard d55b649 还是能看到文件修改的
但是到了 b938bf7 这个版本就没有了
bombless
2017-06-29 16:58:08 +08:00
没看懂,b938bf7 和 d55b649 是什么关系
yatesun
2017-06-29 18:22:06 +08:00
@bombless 时间上是先后顺序。
yatesun
2017-06-29 18:28:59 +08:00
@yatesun 准确的说,4c44067 在 67f3d92 之后
networm
2017-06-29 18:31:07 +08:00
错误的合并 * b938bf7 - 测试 (7 days ago) <user1> 导致的问题
注意,这是一个合并提交,虽然提交信息没写 Merge。
下面是错误发生过程:

user1 提交 4c44067
user1 pull 发现有别人的提交并产生了冲突
user1 想要回到 pull 之前的状态,错误地使用了 reset 或 checkout 命令,此处不一定是 reset --hard head^,也可以单个文件 reset 或者使用 checkout 重置文件状态。
user1 处理完成后提交 b938bf7

关键问题:
user1 错误地处理合并冲突,如果想要撤销合并,需要使用 merge --abort 才可以,否则 merge 信息会保留,下次提交是直接算合并提交。
解决方案:
1 如果错误的提交并未在主分支,暂时还没有其他人拉去此分支,那么可以直接将当前分支 reset --hard 到 d55b649,然后 cherry-pick 4c44067 3b9e834,再使用 push--force 强制推送当前分支,user1 fetch 后 reset --hard origin/yatesun 分支,假定当前分支是 yatesun。
2 如果错误提交已在主分支,即其他人已 pull,为了减少他人
麻烦,可以 log 4c44067..d55b649,然后将列出的所有提交手动 cherry-pick 到当前分支,push 即可。

避免方法:
1 了解 pull = fetch + merge
2 了解特定操作撤销只能使用对应命令到 --abort,如:merge rebase cherry-pick 等。
3 改善分支工作流,消除 pull 导致的无用 merge 提交,可以考虑使用服务器端钩子检查。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/371911

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX