0

下面的场景详细说明了远程 git repo 上错误地删除了文件的情况。如果您滚动浏览下面的提交,问题确实出现了COMMIT 4,实际上就它是否意外/预期而言,我想知道是否有一种通用的方法来解决这个问题。最好完全避免在分支中包含不需要的文件,但是当遇到像 in 这样的情况时COMMIT 4,我的问题是应该怎么做?

COMMIT 1 (18 days ago): created on local repo file <code1.java> on branch [code1]
                        and pushed to remote branch [code1] for initial commit 
                        of the file

COMMIT 2 (14 days ago): changed a variable in the file <code1.java> on branch [code1] 
                        and pushed to remote branch and created PR 

COMMIT 3: (7 days ago): created on local repo the file <code2.java> on branch [code2]
                        and pushed to remote branch [code2] for initial commit 

COMMIT 4: (6 days ago): **noticed that on [code2] branch I somehow had checked in 
                        <code1.java> with commit 3** so I deleted the file <code1.java> 
                        from branch [code2] and pushed to remote branch [code2] 
                        and did a PR for [code2]

COMMIT 5: (5 days ago): changed formatting on file <code2.java> on branch [code2] 

COMMIT 6: (4 days ago): PR reviewer accepted changes to <code1.java>
                        and merged branch [code1] to master 

COMMIT 7: (3 days ago): PR reviewer accepted changes to <code2.java>
                        and merged branch [code2] to master 

code1.java 现在不见了 :( :( :(

4

2 回答 2

2

听起来您的code2分支基于code1而不是master. 当您这样做时,您包含了当时该分支中的所有代码,包括code1.java.

当你合并时code2,Git 只考虑了合并的三个点:合并基础(提交 2)和两个头。由于文件在一侧(提交 6)未更改,而在另一侧有修改(删除),Git 应用修改并删除了文件。

在这种情况下, contains 是可以的,因为它基于包含它的分支:它不是您包含的无关更改code2code1.java通过删除它,您实际上确实引入了一个无关紧要的更改——删除——这与您的意图相反。

避免这种情况的最简单方法是在处理项目时始终分支master,这意味着您不会有多余的东西要删除。如果您不小心基于另一个分支,您可以执行git rebase --onto master code1将基于您的分支code1并把它放在上面的操作master。然后,您可以检查它以查看将来是否需要添加或删除内容。

于 2019-07-08T22:18:25.760 回答
1

你可以用

git checkout <commit4-SHA1>^ -- path/to/code1.java

(注意 carret ( ^) 表示“此提交的父级”)

然后它将被检测为新文件git status。只需添加并提交即可。

如果删除是 said 中的唯一更改COMMIT 4,您也可以使用git revert <commit4-SHA1>

于 2019-07-08T21:48:37.553 回答