mel*_*oon 270 git git-branch
以下是我在master分支中使用的命令
git branch experiment
git checkout experiment
Run Code Online (Sandbox Code Playgroud)
然后我对我的文件进行了一些更改,提交了更改,并将新分支推送到GitHub.
git commit .
git push -u origin experiment
Run Code Online (Sandbox Code Playgroud)
请注意,在git commit .
提示我提交提交消息后,我给了它一个.后来我决定将我的实验分支合并到主分支中.
git checkout master
git merge experiment
Run Code Online (Sandbox Code Playgroud)
最后我将更改推送到GitHub.
git push -u origin master
Run Code Online (Sandbox Code Playgroud)
一切顺利,直到我尝试删除我的实验分支使用
git branch -d experiment
Run Code Online (Sandbox Code Playgroud)
我收到了错误消息error: The branch 'experiment' is not fully merged.
我对git有点新鲜,我不知道我有多可能合并这两个分支.我在这里错过了什么?
seh*_*ehe 288
注意措辞根据提交而改变.谢谢@slekse
这不是一个错误,它是一个警告.这意味着您要删除的分支包含以下任何一个都无法访问的提交:其上游分支或HEAD(当前已检出的修订版).换句话说,当你可能失去提交¹.
在实践中,这意味着您可能修改,重新设置或过滤了提交,但它们看起来并不相同.
因此,您可以通过删除其他分支来检查包含您未引用的提交的分支来避免该警告 .²
您需要验证您实际上没有遗漏任何重要的提交:
git log --graph --left-right --cherry-pick --oneline master...experiment
Run Code Online (Sandbox Code Playgroud)
这将为您提供分支之间任何非共享的列表.如果你很好奇,可能会有所不同--cherry-pick
,这种差异很可能是你得到警告的原因:
--cherry-pick
当提交集受限于对称差异时,省略任何引用与"另一方"上的另一个提交相同的更改的提交.例如,如果您有两个分支A和B,通常只在一侧列出所有提交的方法是--left-right,就像上面该选项说明中的示例一样.然而,它显示了从另一个分支中挑选出来的提交(例如,"b上的第3个"可以从分支A中挑选出来).使用此选项,将从输出中排除此类提交对.
¹默认情况下,他们真的只是一段时间后才收集垃圾.此外,该git-branch
命令不会检查所有分支的修订树.警告是为了避免明显的错误.
²(我的偏好是强制删除,但你可能想要额外的保证).
drw*_*owe 77
正如Drew Taylor指出的那样,使用-d的分支删除仅考虑当前 HEAD来确定分支是否"完全合并".它会抱怨即使转移是合并一些其他的分支.在这方面错误消息肯定会更清楚......您可以在删除之前签出合并的分支,或者只使用git branch -D.首都-D将完全覆盖支票.
qwe*_*guy 14
我尝试了sehe的答案但它没有用.
要查找尚未合并的提交,只需使用:
git log feature-branch ^master --no-merges
Run Code Online (Sandbox Code Playgroud)
Dre*_*lor 13
今天我发生了这件事,因为我将我的第一个功能分支合并为主人.正如一些人在SO的其他地方所说的那样,诀窍是在尝试删除分支之前切换回master.一旦回到master中,git很乐意在没有任何警告的情况下删除分支.
Elt*_*lab 12
带解释的最简单解决方案(双重检查解决方案)(之前遇到过问题)
问题是:
1-我无法删除分支
2- 终端不断显示一条警告消息,指出有些提交尚未批准
3- 知道我检查了 master 和 branch 并且它们是相同的(最新)
解决方案:
git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name
Run Code Online (Sandbox Code Playgroud)
解释:
当您的分支连接到上游远程分支(在 Github、bitbucket 或其他任何地方)时,您需要将其合并(推送)到 master 中,并且您需要将新更改(提交)推送到远程存储库(Github、bitbucket 或无论如何)来自分支机构,
我在代码中所做的是切换到 master,然后将分支合并到其中(以确保它们在本地机器上相同),然后我再次切换到分支并将更新或更改推送到远程在线使用“git push”的回购。
之后又切换到master,尝试删除分支,问题(警告信息)消失,分支删除成功
小智 5
你可以简单地算出:
git log --cherry master...实验性的
--cherry
选项是同义词--right-only --cherry-mark --no-merges
git-log 手册页说
将输出限制为我们这边的提交并使用 git log --cherry upper...mybranch 标记那些已应用于分叉历史记录另一侧的输出很有用,类似于 gitcherryupstreammybranch。
供参考。--cherry-pick
省略了等效的提交,但--cherry-marks
没有。找到变基并强制上游和协同工作公共分支之间的更新更改很有用
Git 警告您删除此分支可能会丢失历史记录。尽管它实际上不会立即删除任何提交,但如果分支上的部分或全部提交也不属于其他分支,则它们将变得无法访问。
\n\n对于experiment
要 \xe2\x80\x9c 完全合并 \xe2\x80\x9d 到另一个分支的分支,其尖端提交必须是另一个分支 \xe2\x80\x99s 尖端的祖先,使提交成为experiment
另一个分支的子集分支。这使得删除变得安全experiment
,因为它的所有提交都将通过另一个分支保留在存储库历史记录中。它必须被 \xe2\x80\x9cfully\xe2\x80\x9d 合并,因为它可能已经被合并了几次,但现在自上次合并以来添加了不包含在其他分支中的提交。
不过,Git 不会检查存储库中的每个其他分支;只有两个:
\n\n正如您的情况一样,的 \xe2\x80\x9cupstream 分支\xe2\x80\x9dexperiment
可能是origin/experiment
。如果experiment
完全合并到当前分支中,Git 会毫无怨言地删除它。如果不是,但它已完全合并到其上游分支中,则 Git 会继续显示如下警告:
warning: deleting branch 'experiment' that has been merged\nto 'refs/remotes/origin/experiment', but not yet merged to\nHEAD.\nDeleted branch experiment (was xxxxxxxx).\n
Run Code Online (Sandbox Code Playgroud)\n\n其中xxxxxxxx
表示提交 ID。在其上游完全合并表明提交已experiment
被推送到原始存储库,因此即使您在这里丢失它们,它们至少可以保存在其他地方。
由于 Git 不会检查其他分支,因此删除一个分支可能是安全的,因为您知道它已完全合并到另一个分支中;您可以使用-D
指示的选项来执行此操作,或者先切换到该分支并让 Git 为您确认完全合并的状态。
归档时间: |
|
查看次数: |
112885 次 |
最近记录: |