可能是我 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 没有看到修改记录。
1
yatesun OP 就是我提交的内容,被同事覆盖了,但是却没有在 git 提交历史中看到他的修改,或者有可能他也不知道他覆盖了我修改的部分。
|
2
GGGG430 2017-06-29 14:29:58 +08:00
Merge: 67f3d92 abee8a4 这部分 log 在 master 上, 你当前应该不在 master
|
3
yatesun OP @GGGG430 我执行了 git branch,确实是 master 分支,而且这个 git 比较特殊,本身就没有任何其他分支。
|
4
yatesun OP |
5
GGGG430 2017-06-29 14:39:14 +08:00
如果时在 master 分支的话, merge 应该是你在 commit 之前没有 pull, 然后 push 提示需要 pull 产生的;
|
6
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 把这个的提交记录拿出来看看
|
7
yatesun OP @GGGG430
对的 我一般是修改完代码之后 git pull git commit -am "编辑内容" git push 但有时候 git pull 的时候,提示有冲突,要先 commit,于是就是 git pull git commit -am "编辑内容" git pull git push |
8
GGGG430 2017-06-29 14:44:12 +08:00
@yatesun 我有过一段时间, 如果 commit 之前 pull 也有冲突, 我会先把冲突的本地文件 checkout/stash, 然后 pull, 尽量避免产生 merge, 这样查 log 时就比较好看, 就看你有没有洁癖了哈哈
|
9
yatesun OP @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> |
12
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> |
13
GGGG430 2017-06-29 14:48:45 +08:00
Merge: 67f3d92 abee8a4
你看在这之前的 log 都有的 |
15
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, 然后再提交成功的 |
16
yatesun OP |
17
bombless 2017-06-29 16:58:08 +08:00
没看懂,b938bf7 和 d55b649 是什么关系
|
20
networm 2017-06-29 18:31:07 +08:00 via iPhone 1
错误的合并 * 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 提交,可以考虑使用服务器端钩子检查。 |