最近,我被要求cherry-pick
提交.
那么,在git中挑选一个提交意味着什么呢?你怎么做呢?
我有两个分支(和主人).分支2基于分支1是基于主.我已经提交了分支1进行审核,它有一些更改,我将其中一些更改重新编入历史记录并将结果合并到主数据中.
现在我需要在master上重新设置Branch 2以准备审查/合并.
问题是分支2仍然包含分支1的原始提交,它不再存在,因此git会混淆.我尝试使用rebase -i删除Branch 1的原始提交,但是Branch 2的提交不基于master-before-branch-1.
我需要做的是采取分支2,删除一些提交,并在一次操作中仅重新设置master上的剩余提交.但我只知道如何在两个不同的步骤中完成这两项操作.
我怎样才能将我的分支部分重新分支到另一个分支,删除所有不具有共同祖先的提交,除了我指定的那些(例如从HEAD~2起)?
这是当前状态:
master new branch 1
- - - - - - - - - - - | - - - - - - - - -
\
\ branch 1
\ _ _ _ _ _ _ _
\
\ branch 2
\ _ _ _ _ _ _ _
Run Code Online (Sandbox Code Playgroud)
我最终想要的是:
master new branch 1
- - - - - - - | - - - - - - - - …
Run Code Online (Sandbox Code Playgroud) 我已经创建了一个简单的git repo来说明我的问题,可以在GitHub上找到:https://github.com/smileyborg/EvilMerge
这是回购历史的例证:
master A---B---D---E-----G-----I
\ / \ /
another_branch ----C \ /
\ /
another_branch2 F---H
Run Code Online (Sandbox Code Playgroud)
(在GitHub上的实际回购中,D
是4a48c9
,I
是48349d
.)
D
是一个"简单"的邪恶合并,其中合并提交"正确"解决了合并冲突,但也产生了一个不相关的"邪恶"变化,这两个变化在父系统中都不存在.通过git show -c
在此提交上使用,可以发现此合并的"邪恶"部分,因为输出包括++
和--
(而不是单个+
和-
)以指示父级中不存在的更改(请参阅上下文的答案).
I
一种别样邪恶的合并,其中合并提交"正确"的解决合并冲突(从变化所引起F
,以file.txt
与变化相冲突G
),也有"邪恶"丢弃到一个完全不同的文件中所做的更改file2.txt
(有效撤消变化H
).
你怎么知道这I
是一个邪恶的合并?换句话说,您可以使用哪些命令来发现I
不仅手动解决冲突,而且还无法合并应该具有的更改?
正如下面的RenéLink所指出的那样,很难(或许不可能)定义一套通用标准来识别"邪恶合并".然而,就像最高法院大法官斯图尔特所说的关于色情内容一样,当你看到邪恶的合并是你所知道的.
因此,或许更好的问题是:在合并提交中可以使用什么git命令来获得仅在合并提交本身中引入的所有新颖更改的diff输出.这种差异应包括:
D
)I
)这里的目标是能够让人类看看这个输出并知道合并是否成功或(意外或恶意)"邪恶",而 …
我很想知道你是否可以,如果将提交合并到我的孤儿分支中是否有任何问题.对于此特定实例,我的Salesforce存储库具有主分支和预发布分支,但由于我们的沙箱环境通常具有不属于生产的元数据,但我们希望对其进行版本控制,但与我们的干净预发布分支分开.
因此,我们有以下内容:
(Production Init Commit) (official release)
/ /
o-------------------------o [master]
\ /
o------o---------o----o [pre-release]
\ /
o-----O [feature]
\ <-- IS THIS ALLOWED/POSSIBLE/BAD IDEA?
\
o------------O [DEV] (orphan branch)
/
(Initial commit from our sandbox environment)
Run Code Online (Sandbox Code Playgroud) 我有一个情况.比方说,两个开发人员是在两个不同的分支工作A
和B
.
-- master --
| |
A <-- B
Run Code Online (Sandbox Code Playgroud)
分支B
取决于变化A
.但是,A的变化尚未合并master
.我想开始处理我的功能(分支B
)并进行更改A
,然后在完成测试后丢弃它们.推荐的方式是什么?
我有一个项目有两个分支,名为master和feature/x.在feature/x上我正在处理将在master上合并的新功能.
对于feature/x上的错误,基于master的rebase操作已完成并被推送.除了其他提交已完成并推送功能/ x.
所以我有两个分支,包含由不同哈希标记的"相同提交".
A -- B -- C -- D [master]
\
E -- F -- G -- H -- I [feature/x]
Run Code Online (Sandbox Code Playgroud)
其中C
和D
上主分别是相同的提交(衍合)F
和G
上特征/ X.
我想删除F
和G
从feature/x维护H
和I
.我该怎么做?
我想恢复提交
git revert F G
Run Code Online (Sandbox Code Playgroud)
来自feature/x,但那些无用(重复)提交将保留在历史记录中.我想知道是否有更好的方法来做到这一点?
所以我遇到了一个情况,有一个主分支和一个继续它的错误修复分支。我尝试压缩 master 上的一些提交,然后重新修复 bugfix,但遇到了合并冲突。正确的做法是什么?我在本地工作,没有远程。
它看起来像这样:
A - B - C - D - E - F [master]
\
G - H - I - J - K [bugfix]
Run Code Online (Sandbox Code Playgroud)
我想压缩 A - B - C - D - E - F 并且仍然有错误修复继续压缩的主分支。
问题是:我有一个项目,我通过 netbeans 连接到我的实时 git 存储库,并进行了提交。然后我试着拉代码,我收到一条消息,我是想和master合并还是我想rebase,我不小心rebase了。现在我的本地项目中没有初始化任何 git repo(从 USB 复制代码)。Rebase 初始化了一个 git repo 的副本。这个动作发生的事情真的很烦人。我在当前目录中所做的所有更改都被删除的文件也被删除了,我已经恢复了被删除的文件。但是我仍然无法回到rebase之前的状态(即新鲜状态)。任何帮助都会非常有帮助。
我一直在开发提交主分支,并希望将所有提交超出"初始提交"到一个单独的开发分支,并保持主版本的发布版本.
现在,我的树看起来像这样:
master: A - B - C - D - E - F
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像这样:
development: B - C - D - E - F
/
master: A -----------------
Run Code Online (Sandbox Code Playgroud)
这样我就可以像这样合并一个版本:
development: B - C - D - E - F --- X
/ \
master: A ----------------------- Y
Run Code Online (Sandbox Code Playgroud)
有人可以建议最好的方法吗?我已经看到了类似但不是确切的案例的其他答案,但我不想冒险搞砸了.