我有时想从不同的存储库中选择一系列提交.我知道有两种方法可以做到这一点.
1.
git checkout myBranch
git cherry-pick begin..end
Run Code Online (Sandbox Code Playgroud)
要么
git rebase --onto myBranch begin end我发现第一个版本更容易记住.然而,我读了很多关于如果采摘与挑选相比,挑选樱桃是多么邪恶,因为它有点打破了历史.但我还没想到的是,如果樱桃选择一系列提交或者将它们重新定位,那么它们之间是否存在差异--onto
我倾向于认为应该没有区别.我错了吗?
最近在我们所有的回购中,我们为我们所有的回购添加了一个git属性文件.想法是强制在所有文件中使用Unix EoL字符.当您结帐到新分支时,这会在第一天创建大量问题,它开始显示整个文件中的更改.我们只是承诺了.
现在,问题是如果我们从一个分支合并到另一个分支(我们经常这样做)或者挑选(我们做更多)合并在所有文件中再次显示冲突.
如果git可以通过首选项忽略行结尾或空格变化,那将是理想的.有谁知道git是否包含这样的东西或者是否有解决方法?
好吧,我有一个问题,我不知道如何解决。
首先,回顾一下历史:
我从上游拉取更改,并将它们与我正在工作的分支合并。当时,我可能一直在使用具有 root 访问权限的控制台窗口。我这么说是因为我注意到一天后我无法保存到本地存储库中的很多文件。我注意到所有者/组已更改为 root,权限为 644。在检查并查找所有搞砸的文件后,我将所做的一些更改推送回我的远程工作分支。
一周后(现在),我从远程分支向开放拉取请求添加了其他几个提交。其中中间是我在修复本地存储库文件权限后所做的提交。我注意到它有大约 1200 个“空”文件(没有变化)。我有点担心将这个拉取请求合并到上游可能会导致大问题,而且我不知道如何删除这个提交,或者是否有可能......
我尝试创建一个新分支并使用cherry-pick来获取除一个提交之外的所有分支,但我已经删除了文件,并且无法合并旧的提交,这些旧的提交在当时存在的文件和当前存在的文件之间存在“冲突”。本地仓库中不再存在...
无论如何,有什么想法吗?
如果我的符号或术语错了,我道歉.我已经git在我的个人项目上使用了一段时间,并且不必处理复杂的合并场景.我们开始在工作中使用它,并且正在遇到更复杂的场景.我还是一个git新手,所以我想弄清楚樱桃采摘的最佳做法.
情景一

在这里,我们有一个master,fix和develop分支.在我们分支之后fix,我们将版本号更新为1.0.1.我们做了相同的develop,并将版本号更改为1.1.0.
比方说,修复F1,F2和F3都致力于fix.出于这些,我们关心的修复F2和F3,而不是F1因为它是一个改变一个弃用的功能.我们也不关心版本号的变化1.0.1.
现在我们可以将这些更改合并回来master,fix而不会出现问题.但是如果我想将这些变化合并到一起develop呢?现在我正在使用git cherry-pick挑选F1和F2.此外,对于大量的提交,我使用一系列提交樱桃挑选,这似乎工作正常.这是最好的做事方式吗?
这让我想到了下一个场景git cherry-pick:
情景2

如果术语不正确,或者我的图表没有意义,我再次道歉.这是我能描述的最好的.
所以在这种情况下,我们hotfix除了上面的分支之外还有一个分支.比方说,有人承诺修补程序H1和H2进入hotfix,然后合并这些变化为master,fix和develop.
大约在同一时间,别人犯的修复F1,F2以及F3到 …
从Merge、update 和 pull Git 分支上接受的答案中而不使用 checkouts,
如果分支 B 会导致非快进合并,则不能在不先检查 A 的情况下将分支 B 合并到分支 A 中。这是因为需要一个工作副本来解决任何潜在的冲突。
我推断并说您也git cherry-pick不能到达未结账的目的地是否正确?
我有一个功能分支:
feature
Run Code Online (Sandbox Code Playgroud)
假设有 10 次提交
然后前段时间我开始对其进行实验,但想保留当前的功能以防万一,所以我开始了一个新的分支:
feature-experiment
Run Code Online (Sandbox Code Playgroud)
然后又进行了 10 次提交
今天我决定merge feature-experiment进入feature然后我删除了feature-experiment。我解决了一些合并冲突。
然后,我的 20 个提交都使用相同的名称并以WIP(正在进行中的工作)结尾,非常难看,所以我决定
git rebase -p -i HEAD~22
Run Code Online (Sandbox Code Playgroud)
我改为pick将s它们全部压缩到此功能的最旧提交中,但我遇到了一些合并冲突(与以前相同)。我解决了它们然后
git add -A && git commit
git rebase --continue
Run Code Online (Sandbox Code Playgroud)
但现在我收到以下错误:
error: Commit asd123qsd is a merge but no -m option was given.
fatal: cherry-pick failed
Could not pick asd123qsd
Run Code Online (Sandbox Code Playgroud)
这是最后一次提交(合并)
我再次尝试,但这次我没有将此特定提交更改pick为s,但遇到了相同的错误。
我怎样才能进行这个可怕的变基呢?
我在想,作为一种可能的解决方案,我可以修改最后一次提交以将 -m 添加到其中,但是我该怎么做以及如何使用此 -m 命令?还有其他选择吗
我们最近从 SVN 迁移到 GIT,我们的代码托管在 Atlassian Bitbucket 上,并使用 Atlassian SourceTree 作为我们的桌面客户端。现在我们有几个带有代码库分支的项目,即。UAT 的集成分支和 Stage 的发布分支。问题是,在通过 SourceTree 将代码从 UAT 迁移到 Stage 时,我们正在使用cherry pick 进行大量提交,这让我们发疯。我们是否有替代源代码树中这个繁琐过程的替代方法,或者我们是否必须编写脚本。谢谢
注意:这是对我之前的帖子(现已删除)的改写。重新措辞旨在为帖子提供不同的重点。
运行后git cherry-pick,git报告有冲突。我解决了冲突,然后跑了git cherry-pick --continue。此时,$GIT_EDITOR弹出一个COMMIT_EDITMSG缓冲区,其中预先填充了精选提交的原始消息以及一些附加信息,其中包括警告:
# It looks like you may be committing a cherry-pick.
# If this is not correct, please remove the file
# .git/CHERRY_PICK_HEAD
# and try again.
Run Code Online (Sandbox Code Playgroud)
我检查了如果我“删除”(实际上只是暂时重命名).git/CHERRY_PICK_HEAD文件会发生什么。这产生的直接外部影响是|CHERRY-PICKING从我的git-aware 提示中删除指示。
除了我的提示中的这一变化,以及COMMIT_EDITMSG缓冲区中预先填充的信息可能存在一些差异之外,在有或没有.git/CHERRY_PICK_HEAD文件的情况下执行提交会有什么区别?
更准确地说,我试图在这里比较两种情况。
在第一个场景中,我运行
% git cherry-pick --continue
Run Code Online (Sandbox Code Playgroud)
...并且(无视前面引用的警告)我像往常一样继续提交。
在第二种情况下,我运行
% rm .git/CHERRY_PICK_HEAD
% git commit
Run Code Online (Sandbox Code Playgroud)
...并像往常一样继续提交。
(假设我在两种情况下都使用相同的提交消息。)
这两种情况的最终结果会有什么不同?
好的,我们一般的 git 结构是,我们有一个 master 分支,一个或多个发布分支,然后是特性分支。所有主要开发都发生在功能分支中,但错误修复有时会直接提交到发布分支。
在将一些功能合并到发布分支时,出现了一个错误的合并,但我们没有注意到它,直到之后提交了几个错误修复。一些功能分支在合并后被删除(我们将更改工作流程,仅在将来发生实际发布后才执行此操作)。如果它们没有被删除,我们只需废弃发布分支并重做即可。
我现在正在努力消除这种糟糕的合并。我在合并之前从发布分支创建了一个新的发布分支。
git checkout <hash prior to merge>
git checkout -b new_release_branch
git merge feature_branch_which_resulted_in_bad_merge_before
Run Code Online (Sandbox Code Playgroud)
这个分支现在是我们想要的方式,但我仍然需要引入在错误合并后对 release_branch 进行的少数(少于 5)次提交。但我不知道该怎么做。我认为樱桃挑选是最好的选择,但当我尝试时,我得到:
$ gitcherry-pick fa4a761
错误:fa4a761:无法挑选一个 blob
致命:挑选失败
$ git cherry-pick 44923992349dae68d982dd305a289ba63f8f6d0b
fatal: bad object 44923992349dae68d982dd305a289ba63f8f6d0b
Run Code Online (Sandbox Code Playgroud)
请注意,上面的哈希是从 gitk 复制/粘贴的,但它不会显示在我的任何分支的任何 git 日志中。
我还回去检查了我现在正在尝试修复的所有提交,它们都是相同的。我不确定这意味着什么,或者为什么它们会出现在 gitk 中而不是出现在 git log 中(gitk 从哪里获取信息?)。
好的,更新时间。这是我遗漏的故事的其余部分。当我发现损坏的合并时,我创建了一个新的存储库克隆,以便从我们的中央存储库中“使用”。
事实证明,所有问题提交都从未从存储库的原始副本推送到中央存储库。一旦我推动了这些提交,我就能够很好地修复所有问题。
我从我不再需要的分支中精心挑选了一个提交。
如果我精心挑选了一个在删除分支后将不再存在的提交,这是否是不好的形式/是否会出现任何问题?