Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 更改在推送后具有两个父级的提交的提交者名称_Git_Github - Fatal编程技术网

Git 更改在推送后具有两个父级的提交的提交者名称

Git 更改在推送后具有两个父级的提交的提交者名称,git,github,Git,Github,我正在尝试使用以下方法更改提交者名称: 我已向分支A提交了从“B”提取的请求,在提取后,我得到了要解决的冲突,但我错误地从其他用户提交了请求 现在我正试图重新设置它的基址,但它没有显示编辑器中的commit(冲突解决后合并commit)将PICK更改为EDIT 下面是我的gitk图片,我想用黄色突出显示更改提交 (注意:如果您有权访问Git 2.18,您可以尝试全新的rebase。请参阅。我不知道它是否适用于这种特殊情况。) 重定基可删除合并,因为重定基可消除合并的需要 有一种形式的git-r

我正在尝试使用以下方法更改提交者名称:

我已向分支
A
提交了从“B”提取的请求,在提取后,我得到了要解决的冲突,但我错误地从其他用户提交了请求

现在我正试图
重新设置它的基址,但它没有显示编辑器中的commit(冲突解决后合并commit)将
PICK
更改为
EDIT

下面是我的
gitk
图片,我想用黄色突出显示更改提交

(注意:如果您有权访问Git 2.18,您可以尝试全新的rebase。请参阅。我不知道它是否适用于这种特殊情况。)

重定基可删除合并,因为重定基可消除合并的需要

有一种形式的
git-rebase
可以重新创建合并(它只是再次运行
git-merge
),但对于您的案例来说,这不是正确的方法。对于您的情况,正确的方法是再次运行
git merge
,或者根本不运行

记住,
git pull
只意味着运行
git fetch
,然后运行
git merge
。(或者,如果您告诉它运行
git-rebase
作为第二个git命令,运行
git-fetch
,然后运行
git-rebase
)如果您是git初学者,我个人建议避免使用
git-pull
。改为运行两个单独的命令。结果将更有意义

您可以使用
git reset
将当前分支名称移回尚未发生
git合并的点。如果您使用
git reset--hard
,这将产生相当不幸但至关重要的副作用,即抛出所有后续提交,并清除未提交的工作。这是一个信号,帮助你意识到你所做的是相当激烈的。在开始之前,您需要设置一个名称—一个分支或标记名来记住所有原始提交,这样在删除当前分支的所有提交的
git reset--hard
之后,您仍然可以获得原始提交(现在仅在您刚设置的新分支或标记名上)

删除合并后,现在可以再次运行
git merge
重新执行合并。这一次,如果您愿意,您可以使用不同的提交者名称。注意,您得到的是不同的提交,具有不同的散列ID

重新执行合并后,您现在可以正确地复制所有后续提交。您可以使用git cherry pick
及其提交哈希ID一次执行一次提交。每个复制的提交都会获得一个新的提交者名称和时间戳。(请注意,
git cherry pick
默认情况下会重新使用原始作者和作者时间戳,但您将成为新提交者。)这些新提交会获得与原始提交不同的新哈希ID。这是必要的!它们位于新的和不同的合并提交之上,因此它们是不同的提交,需要不同的ID

要更快地复制所有这些提交,可以使用git-rebase
!事实上,这就是git rebase所做的:它复制提交,以便在启动rebase时,无论您站在哪里,新提交都会出现。(这就是为什么它不需要合并。)但出于教育目的,使用
git cherry pick
更有意义。这清楚地说明了
git-rebase
是如何实现其结果的

现在,您已经将所有原始提交复制到具有不同哈希ID的新的、改进的提交,您可以
git将新提交推送到其他地方。但是,任何已经拥有原始提交的人现在都必须从旧的(错误的)提交切换到新的(更正的)提交。这正是为什么和什么时候这种“重写历史”是不好的:当它为其他人做更多的工作时,他们现在都对你让他们做这些工作感到恼火。如果您从未推动过这些提交,那么没有其他人拥有它们,因此没有其他人会生气;或者,如果你事先和其他人都做了安排,其他人就不允许生气


因此,在这两种情况下,原件从未分发,或者您使用git push--force进行“历史重写”,但所有各方都已同意处理此类推送。这种重写是可以的。在其他情况下,您仍然可以这样做,但您可能不得不希望得到原谅。

git rebase--rebase merges
()是否有帮助?@VonC:是的,尽管它可能决定无事可做,可能需要添加
--force
(我没有尝试过).@torek您能告诉我更改合并提交作者的命令步骤吗?根据VonC的回答,我无法理解。我使用了
git-rebase——rebase合并
,作为回报,我得到了成功的rebase和更新的refs/heads/。这意味着什么?再说一次,您不会更改任何提交。无论您如何做,您将要做的是进行新的提交。您所做的任何提交都使用您配置的
user.name
user.email
作为提交者名称,这意味着您可以临时更改它。或者,您可以使用中描述的环境变量在创建一个合并提交期间临时覆盖
GIT\u AUTHOR\u NAME
GIT\u AUTHOR\u EMAIL
GIT\u COMMITTER\u NAME
GIT\u COMMITTER\u EMAIL