你们在用 git 合并时但不担心自己操作失误把代码弄丢?

2021-09-02 20:45:33 +08:00
 yuann72

这几天用 rebase 的 2 个事例

事例 1:

rebase 前的提交历史大概这样:

提交时间 commit message
10:01 A1
10:02 B
10:03 A2
10:04 C

我想把 A1 和 A2 合并, 用 webstorm 进行 rebase:

action commit message
pick A1
squash A2
pick B
pick C

然后点 start rebase, rebase 完只剩下 A1, B, C 3 个 commit, 这时 npm 开始报错提示有个文件不存在, 看了 A1 commit 的内容发现这个文件在 A1 commit 里被删了, 但是原本的 A1, A2 commit 里并没有删这个文件 接着就是 git reflog 找回 rebase 前的 commit id, git reset 恢复到 git rebase 前, 再试一次 rebase 还是一样 试了几次后发现下面这样进行 rebase 就能达到我的目的, 只剩下 A1, B, C 3 个 commit, 文件也没丢

action commit message
pick A2
squash A1
pick B
pick C

事例 2:

使用 webstorm 右下角 git 分支里的 "Rebase Current onto Selected" 将服务器端的分支内容用 rebase 的方式合并到当前分支 结果合并一半右下角弹出红色感叹号, 报错信息大概这样"文件路径 Permission XXXX", 接着还是 git reflog 找回 rebase 前的 commit id 恢复后再试一次就没报错了 rebase 合并是合并完了, 但我暂存区那些修改完还没提交的文件都不见了! 查了搜索引擎后用 git stash pop 恢复出来

事例 1 可能是我操作失误或文件冲突导致, 也就还好是一个完整的文件被合并丢了, rebase 完立马就发现了, 如果是某几行代码合并丢了, 那以我这的测试程度可能要到生产环境出 bug 报错才会发现。也还好我是提交完 C commit 后就进行 rebase 事例 2 我就担心要是 git stash 里没有我的文件, 或者被我瞎操作把 git stash 清空了那就完了

所以我现在用 git 命令时会很谨慎, 生怕有些代码给我弄丢了. 特别是合并冲突处理文件冲突的时候, 面对这几个月前编辑的代码, 我也不知道哪边的版本是正确的代码

5493 次点击
所在节点    git
41 条回复
af463419014
2021-09-02 20:47:55 +08:00
tar -zcvf xxx
合并前直接打个本地压缩包,弄乱就删掉重新解压操作
yuann72
2021-09-02 20:51:58 +08:00
@af463419014 #1 我担心代码合并丢了自己都没发现😳
ayase252
2021-09-02 20:52:10 +08:00
不可能弄丢的。git reflog 里面有所有的操作历史,搞坏了 reset --hard 回来就行了,跟撤回一样的
yuann72
2021-09-02 21:06:29 +08:00
@ayase252 #3 合并丢的时候没发现,等到发现的时候可能已经产生线上 BUG 了。我担心的是这一点
renmu123
2021-09-02 21:53:36 +08:00
我从来没有弄丢过文件,我都是 commit 之后再进行 merge
revlis7
2021-09-02 22:16:59 +08:00
那你有没有想过即便没有操作失误,git 的 auto merge 也是有可能导致代码出现 Bug 的?

这个不是你如何操作的问题,你需要的是 Review 和 Test
wudicgi
2021-09-02 22:20:47 +08:00
基本不用 rebase, 而且一般 merge 都是强制 no fast-forward

另外怕丢历史的话,可以创建一个新分支再操作
没创建的话其实 reflog 也能找回来,就是还得人工核对一下
bwt
2021-09-02 22:26:50 +08:00
自从 git 用熟练后就没丢过了,rebase 我比较习惯命令行,合并冲突代码时比较直观🤣
creanme
2021-09-02 22:28:03 +08:00
我之前有次 git pull (rebase) 下来,发现有个文件处于被删除状态,不太明白为啥会这样。
Mutoo
2021-09-02 22:28:13 +08:00
既然你用的是 webstorm 那就完全没并要担心了,因为 webstorm 还提供 local history,就算你整个 commit 都原地消失,通过 local history 也可以还原。
yuann72
2021-09-02 22:51:07 +08:00
@creanme #9 这问题有遇到过
yuann72
2021-09-02 22:53:04 +08:00
@revlis7 #6 啊这,我一直以为 GIT 是个很成熟的软件,原来自动合并是会出 bug 的
beidounanxizi
2021-09-02 22:58:26 +08:00
@yuann72 那叫 fast foward
自己如果不懂什么叫做 git conflict 的话
去了解下 什么样的情况 才会产生 conflict ,
自己在不同的分支 对同文件 修改也会 conflict 呢
reflog + reset --hard 时光隧道局了解下?!
QingStone
2021-09-02 23:44:41 +08:00
@creanme #9 可能是远程上有人提交了一个删除该文件的提交记录
ampedee
2021-09-03 00:23:03 +08:00
面对未知当然容易恐惧,弄懂 git 每一次 merge,rebase 背后的原理这些都是日常操作。
可以看下我写的关于 git 原理和撤销操作的博客: https://www.waynerv.com/posts/git-undo-intro/

另外需要合并几个月前编辑的代码说明你们需要改进工作流,一个分支不应该存在这么久
msg7086
2021-09-03 02:21:11 +08:00
@yuann72 #12


就算不用 Git 也会出 bug 呢,这管 Git 啥事。
一个人改了文件 A,另一个人改了文件 B,你怎么知道这两个文件分别改完以后程序能正常运行?

至于这个帖子里的问题:
如果你提交记录里 A2 和 B 有冲突的话,那么 A2 和 B 是不能随便交换位置的。
换句话说,交换 A2 和 B 是需要手动处理的。
所以如果这个操作我来做的话,会是

1. 在 A1 上新建一个分支 tmp 。
2. 把 A2 cherry pick 到 tmp 上,然后解决冲突。
3. 把 A1 和 A2 squash 成 A 。
4. 把 B cherry pick 到 tmp 上,然后解决冲突。
5. 把 C cherry pick 到 tmp 上。
6. 把原来的分支指向 C 。
这样得到一个 A-B-C 。这么操作应该是最稳妥的方案了。

然后关于在还没有提交的时候去 Rebase 的问题:

不!要!这!么!做!

Rebase 是在提交链上的操作。处理提交链的时候本地文件夹是要清空的。
(其实不需要完全清空,无冲突 untracked 文件可以保留,但是很多 Git 软件为了安全,是要完全清空的。)
当你点击 Rebase 按钮的时候,其实就是在告诉 Git,

清空我本地的文件夹,以便修改提交,做 Rebase 。

所以你修改的文件当然会消失掉,因为他们被自动 Stash 了。
然后如果 Rebase 出现了任何问题,Stash 就不会被自动 pop 。
另外 Stash pop 的时候也可能出现问题。
这些时候都要手动 Stash apply 并修复潜在的问题。

但是这种操作是很容易出错的,如果没有特殊需求,还是建议先 commit 成提交,永久写入 Git 数据库,然后再做 Rebase 之类的操作。然后可以像解决问题 1 里我提到的方法一样,建一个 tmp 分支来操作,操作完以后再把分支切过去。
临时 commit 在操作完以后还可以 undo 回 staged (相当于 reset soft HEAD~1 ),所以这个操作是没有副作用的。
muzuiget
2021-09-03 07:41:00 +08:00
有 git reflog,养成良好习惯就行,开新分支写新特性,真要大操作,整个仓库打包备份。
xuanbg
2021-09-03 07:44:05 +08:00
代码结构没毛病就不太会发生合并冲突。
youmilk
2021-09-03 08:32:58 +08:00
先 commit 再 merge/rebase,然后 idea 还有 localHistory 也能找回代码。
vicnicLight007
2021-09-03 09:06:53 +08:00
用 sourceTree,合并之后不提交,发现问题贮藏一下变动,然后删除贮藏,美滋滋

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

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

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

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

© 2021 V2EX