向上推以提交 --设置上游?



让我们以我现在遇到的这个案例为例:

$ git log --decorate
commit A (HEAD -> dev)
commit B
commit C
commit D
commit E
commit F (origin/dev)

现在,如果我想推到HEAD,因为我已经做了--set-upstream,我可以git push.

就我而言,我想推动dev,但只能提交C,因为我经常修改/挤压/改写我最近的几个提交。我可以做git push origin C:dev,但是鉴于我已经设置了dev分支来跟踪origin/dev,难道没有一种不那么冗长的方法吗?即,有没有办法让我不必指定远程和分支,但仍然推送到某个提交?

我可以做 gitpush origin C:dev,但不是没有一种不那么冗长的方法

......

不是那么冗长,但也许更容易1我假设您C是指提交C的哈希 ID。 您还可以做其他事情。 根据你喜欢的工作方式,你可能会发现这更好,或者不是。 请参阅脚注下方的部分。

当像这样使用语法git pushremoterefspec时,对于包含文字冒号:字符的refspec参数,refspec 参数左侧的内容可以是选择所需提交的任何内容。 原始哈希 ID 效果很好,但相对名称(如HEAD~2dev~2(也是如此,您可以将完整的哈希 ID 缩写为短至四个字符,只要它唯一标识对象即可。

gitrevisions 文档中列出了命名任何给定提交的所有可能方法的完整列表。


1这取决于你觉得容易什么,以及你如何计算"冗长"。 原始哈希 ID 是 40 个字符,dev~2是 5 个字符,所以显然dev~2,但在某种程度上它详细:它有三个单词,dev~2。 计数也可能很棘手,当你有几个可靠的提交时,你想推动几十个或几百个摇摆不定的提交,你想避免推送 - 剪切和粘贴原始哈希ID在这里可能更好。


一个不同的,也许更好的工作流程

这里出现的问题是因为您正在处理一个已命名为dev的分支,这是一种通用的。 相反,假设您有一个名为wobbly-feature-xyzwip/xyz的分支,其中wip代表正在进行的工作,并且是向组中每个人发出的信号,表明分支将定期重写其历史记录,并且不应依赖其中的提交。 然后,您可以安全地将正在进行的、摇摆不定的提交保存在另一个 Git 中origin(这可能更可靠并获得定期备份等(,知道没有人会像他们可能依赖dev提交那样依赖它们。

这使您可以使用git rebase -i随意编辑摇摆不定的分支的历史记录。 当你在那个摇摆不定的分支有一些你觉得很可靠并且应该进入dev的提交时,你可以把它们放在那里。

假设我们从你的 Git 和 Git 中的这个存储库开始,origin,嗯,几乎是其他人:

...--A--B--C   <-- master

D--E   <-- dev

G--H--I   <-- wip/xyz

您现在处理功能分支wip/xyz而其他人处理wip功能分支。 Alice 决定一些提交已经完成并准备就绪,并将它们放入dev因此在运行git fetch origin之后,您的存储库现在具有:

...--A--B--C   <-- master, origin/master

D--E   <-- dev
|
| F   <-- origin/dev

G--H--I   <-- wip/xyz, origin/wip/xyz

现在,您可以随时快进dev以选取新的提交:

...--A--B--C   <-- master, origin/master

D--E--F   <-- dev, origin/dev

G--H--I   <-- wip/xyz, origin/wip/xyz

然后,也随时使用git rebase复制三个 WIP 提交:

...         G'-H'-I'  <-- wip/xyz
       /
D--E--F   <-- dev, origin/dev

G--H--I   <-- origin/wip/xyz

然后强制推动,因为每个人都同意这种事情发生:

...--D--E--F   <-- dev, origin/dev

G'-H'-I'  <-- wip/xyz, origin/wip/xyz

如果你现在觉得你的三个提交中的第一个非常可靠,你现在可以git checkout你自己的dev和快进合并,提交到其中:

...--D--E--F   <-- origin/dev

G'  <-- dev

H'-I'  <-- wip/xyz, origin/wip/xyz

现在,您可以在devgit push推送提交G',从而提供:

...--D--E--F--G'  <-- dev, origin/dev

H'-I'  <-- wip/xyz, origin/wip/xyz

除了现在允许(但没有义务(推送正在进行的提交之外,就所有其他 Git 存储库而言,这与你现在正在做的事情具有完全相同的效果。关键区别在于,存储库dev的标签会在更具体的时间在您的控制下向前移动,因此您永远不会在自己的dev上进行"摇摆不定"的提交。

(这可能会(也可能不会(使您更容易跟踪您认为哪些提交是可靠的。

最新更新