将更改从本地存储库提交到托管在 BitBucket 上的现有存储库
Commit changes from local repository to existing repository hosted on BitBucket
我是 git 的新手,所以请多多包涵。我有一个包含大量代码的本地存储库,直到现在我正在使用邮件与我的朋友共享。今天,我的朋友在 bitbucket 上设置了一个 git 存储库,并进行了一些更改。
我还对我的本地存储库进行了一些更改。现在我想将我的更改提交到远程存储库,但我担心我会弄乱文件。
我现在已经完成了这个 -
git init
git remote add origin <remote-url>
我不知道接下来要做什么。请提出建议。
我想你应该获取...但是你不能只 "checkout" 因为你已经有自己的文件并且 git 可能会在你尝试结帐时警告你就这样。你应该做的最好的事情是
- 为您所做的更改创建补丁
- 可选:从远程仓库(master?)上设置的分支创建本地分支
- 签出 (--force) 远程(或本地分支,如果您创建了它)
- 应用你的补丁并提交
- 可选推送
- 继续享受git
带来的乐趣
由于您已经有一个已在其中工作了一段时间的现有存储库,因此您已经有一些提交创建了与您朋友存储库中的历史记录无关的历史记录。
如果您还不清楚 Git 提交是什么以及它们为您做了什么,以及为什么我按照我的方式绘制提交图片段,请参阅,例如,this answer 到一个不相关的问题。特别注意术语 root commit,并注意如何提交 link。另请注意,每个提交都有自己唯一的哈希 ID(我将其缩写为单字母名称)。这些哈希 ID 很重要。
您现有的存储库有一些提交。为方便起见,我假设您只有四个,都是通过名称 master
找到的,我将通过 D
:
调用 A
A--B--C--D <-- master
这是您的 存储库,由您的 Git 处理。在此存储库中,您现在有 运行:
git remote add origin <remote-url>
远程 URL 告诉您 Git 通过互联网调用 Bitbucket-phone 并获取 他们的 Git 与您交谈,他们 Git 查看您朋友的存储库。所以 origin
现在是 "the URL by which I get my Git to talk to their Git to get commits from, or give commits to their Git." 的缩写,如果你的朋友叫 Jim,我们可以称它为 "Jim's repo"。我可以尝试在任何地方使用 origin
,但我发现这不太有效,所以我打算和 Jim 一起使用 运行。 :-)
获得吉姆的作品
您的下一步是 运行:
git fetch origin
指示您的 Git 调用他们的 Git 并从他们那里获得提交。我不知道 Jim 的 repo origin
中有多少提交,但为了方便,我只画了三个。它们 保证 与您的四个提交具有不同的 ID,因为它们是由 Jim 而不是您创建的 — 它们的作者和提交者是 Jim。此外,Jim 按照 Jim 的时间表制作它们(因此它们是他的时间戳,而不是你的),使用 Jim 之前的提交(所以它们有他的父 ID,而不是你的),即使它们具有相同的保存的快照。所以我们需要给他们不同的字母名称。
您的 Git 将请求他们的 Git 提交。更准确地说,它会询问他们拥有而您没有的。最初,那是他们的 all。所以你的 Git 得到了他们所有的提交。这些都与您的所有提交具有不同的 ID。所以让我们把它们画进去:
A--B--C--D <-- master
P--Q--R <-- origin/master
有两件事您应该立即注意,顺序不限:
origin/master
这个名字从何而来?
为什么有两个根提交?
第一个的答案是 您的 Git 重命名 他们的 Git 的分支。它这样做是因为它必须:您的 Git 需要一个新的、独立的分支名称,以便它们的名称可以与您的名称分开维护。
标准重命名是取他们的分支名称并将"remote"的名称放在前面。您将遥控器命名为 origin
,因此 Jim 的 master
现在是您的 origin/master
.
有两个 root 提交,因为吉姆 his 第一次提交是他自己完成的,没有使用您的任何提交。 (他怎么能用你的?他从来没有过!)他的提交的实际 ID 是丑陋的大哈希,而不是这些单字母名称。这就是我从D
跳到P
的原因。这留下了很多中间空间,并且避免暗示,比如说,E
紧接在 D
之后。
提交 P
和 A
完全无关,这是我们的大绊脚石。你需要决定,现在,如何处理这件事,没有正确的答案。
正在合并
你可以尝试合并这两个不相关的历史。 Git 的旧版本(早于 2.9)将尝试它:您所要做的就是 运行 git merge origin/master
。较新的 Git 版本意识到这不太可能正常工作,并强制您添加标志 --allow-unrelated-histories
。添加标志并不能使它更好地工作,它只是告诉 Git 继续尝试。 如果您选择此方法,您将必须解决所有合并冲突,然后使用该合并结果进行最终提交:
A--B--C--D--E <-- master
/
P--Q------R <-- origin/master
这个合并提交将历史联系在一起。如果 Jim 允许,您现在可以 git push
这个新提交 E
,加上您的 A-B-C-D
到 Bitbucket 存储库。你会让你的 Git 发送所有这些提交,加上 他们的 Git 设置 他们的 [=16= 的请求] 指向提交 E
(或者更确切地说,它的实际、完整、难以理解的哈希 ID)。
重新定基
或者,您可以尝试 变基——即,复制——您的提交,或者更确切地说,您的提交的某些子集,到他们的提交上。例如,如果你的提交 A
是他们的提交 P
的 "sufficiently close",就其保存的源代码树而言,那么你可能只想捕获你更改的 从 A
到 B
,然后你从 B
到 C
的变化,然后你从 C
的变化到 D
。如果您按顺序将它们中的每一个堆叠在它们的提交 R
之上,并让您的 Git 记住您的副本-D
作为您的 master
,您将得到这个:
A--B--C--D [abandoned]
P--Q--R <-- origin/master
\
B'-C'-D' <-- master
其中 B'
是 B
的副本,C'
是 C
的副本,D'
是 [=18= 的副本].
还有更多选择
有很多方法可以组合所有这些东西。然而,将这些 返回 给 Jim,或者以其他方式共享所有这些工作的关键是让各种提交变得相关。您需要有一些共同的提交——在某个点上,当我们绘制这些提交图时,在提交时将提交连接到其父项 "join up" 的箭头。一旦你有了它,剩下的就容易多了。
Jim 仍然需要授予您对 他的 存储库的写入权限,或者——就像在 GitHub 和 Bitbucket 上通常做的那样——你可以创建另一个存储库——在 Jim 可以访问的服务器上(在 Bitbucket 或 GitHub 上)复制。然后,您将提交推送到该服务器上的 您的 存储库,并向 Jim 发送某种警报(例如电子邮件),告诉他 "I have new commits in my widely-accessible repository, that you can fetch and merge into your widely-accessible repository. Please pull them at your convenience." 我们通常称这些为 pull requests,如果你使用其中一些网站上的一些 "fork a repository" 按钮,它们会自动完成你需要做的大部分工作,以将这些警报传递给其他人或组(我在这里一直叫 "Jim" 的那个)。
尽管如此,在所有情况下,您的第一步是做 某事 以便您的提交与 parent/child linkage 相关联提交。确切地说,您想在这里做什么取决于您。请注意,如果您不确定该怎么做,您可以随时克隆当前的克隆,随心所欲地摆弄它,然后看看您是否喜欢 结果。如果没有,您可以 删除 那个克隆并再次重新克隆当前克隆并与新克隆混淆。这为您提供了一种简单的方法来测试每条路径。
(有很多方法可以在不克隆你的克隆的情况下做到这一点——Git 在不 丢失 提交方面非常好——但它们可能很棘手,因为如果你 讨厌结果并想失去它,好吧,Git对不丢失提交非常好,这使得丢失它们非常糟糕. 在单独的克隆副本中工作使所有这些担忧都消失了 window。)
我是 git 的新手,所以请多多包涵。我有一个包含大量代码的本地存储库,直到现在我正在使用邮件与我的朋友共享。今天,我的朋友在 bitbucket 上设置了一个 git 存储库,并进行了一些更改。
我还对我的本地存储库进行了一些更改。现在我想将我的更改提交到远程存储库,但我担心我会弄乱文件。 我现在已经完成了这个 -
git init
git remote add origin <remote-url>
我不知道接下来要做什么。请提出建议。
我想你应该获取...但是你不能只 "checkout" 因为你已经有自己的文件并且 git 可能会在你尝试结帐时警告你就这样。你应该做的最好的事情是
- 为您所做的更改创建补丁
- 可选:从远程仓库(master?)上设置的分支创建本地分支
- 签出 (--force) 远程(或本地分支,如果您创建了它)
- 应用你的补丁并提交
- 可选推送
- 继续享受git 带来的乐趣
由于您已经有一个已在其中工作了一段时间的现有存储库,因此您已经有一些提交创建了与您朋友存储库中的历史记录无关的历史记录。
如果您还不清楚 Git 提交是什么以及它们为您做了什么,以及为什么我按照我的方式绘制提交图片段,请参阅,例如,this answer 到一个不相关的问题。特别注意术语 root commit,并注意如何提交 link。另请注意,每个提交都有自己唯一的哈希 ID(我将其缩写为单字母名称)。这些哈希 ID 很重要。
您现有的存储库有一些提交。为方便起见,我假设您只有四个,都是通过名称 master
找到的,我将通过 D
:
A
A--B--C--D <-- master
这是您的 存储库,由您的 Git 处理。在此存储库中,您现在有 运行:
git remote add origin <remote-url>
远程 URL 告诉您 Git 通过互联网调用 Bitbucket-phone 并获取 他们的 Git 与您交谈,他们 Git 查看您朋友的存储库。所以 origin
现在是 "the URL by which I get my Git to talk to their Git to get commits from, or give commits to their Git." 的缩写,如果你的朋友叫 Jim,我们可以称它为 "Jim's repo"。我可以尝试在任何地方使用 origin
,但我发现这不太有效,所以我打算和 Jim 一起使用 运行。 :-)
获得吉姆的作品
您的下一步是 运行:
git fetch origin
指示您的 Git 调用他们的 Git 并从他们那里获得提交。我不知道 Jim 的 repo origin
中有多少提交,但为了方便,我只画了三个。它们 保证 与您的四个提交具有不同的 ID,因为它们是由 Jim 而不是您创建的 — 它们的作者和提交者是 Jim。此外,Jim 按照 Jim 的时间表制作它们(因此它们是他的时间戳,而不是你的),使用 Jim 之前的提交(所以它们有他的父 ID,而不是你的),即使它们具有相同的保存的快照。所以我们需要给他们不同的字母名称。
您的 Git 将请求他们的 Git 提交。更准确地说,它会询问他们拥有而您没有的。最初,那是他们的 all。所以你的 Git 得到了他们所有的提交。这些都与您的所有提交具有不同的 ID。所以让我们把它们画进去:
A--B--C--D <-- master
P--Q--R <-- origin/master
有两件事您应该立即注意,顺序不限:
origin/master
这个名字从何而来?为什么有两个根提交?
第一个的答案是 您的 Git 重命名 他们的 Git 的分支。它这样做是因为它必须:您的 Git 需要一个新的、独立的分支名称,以便它们的名称可以与您的名称分开维护。
标准重命名是取他们的分支名称并将"remote"的名称放在前面。您将遥控器命名为 origin
,因此 Jim 的 master
现在是您的 origin/master
.
有两个 root 提交,因为吉姆 his 第一次提交是他自己完成的,没有使用您的任何提交。 (他怎么能用你的?他从来没有过!)他的提交的实际 ID 是丑陋的大哈希,而不是这些单字母名称。这就是我从D
跳到P
的原因。这留下了很多中间空间,并且避免暗示,比如说,E
紧接在 D
之后。
提交 P
和 A
完全无关,这是我们的大绊脚石。你需要决定,现在,如何处理这件事,没有正确的答案。
正在合并
你可以尝试合并这两个不相关的历史。 Git 的旧版本(早于 2.9)将尝试它:您所要做的就是 运行 git merge origin/master
。较新的 Git 版本意识到这不太可能正常工作,并强制您添加标志 --allow-unrelated-histories
。添加标志并不能使它更好地工作,它只是告诉 Git 继续尝试。 如果您选择此方法,您将必须解决所有合并冲突,然后使用该合并结果进行最终提交:
A--B--C--D--E <-- master
/
P--Q------R <-- origin/master
这个合并提交将历史联系在一起。如果 Jim 允许,您现在可以 git push
这个新提交 E
,加上您的 A-B-C-D
到 Bitbucket 存储库。你会让你的 Git 发送所有这些提交,加上 他们的 Git 设置 他们的 [=16= 的请求] 指向提交 E
(或者更确切地说,它的实际、完整、难以理解的哈希 ID)。
重新定基
或者,您可以尝试 变基——即,复制——您的提交,或者更确切地说,您的提交的某些子集,到他们的提交上。例如,如果你的提交 A
是他们的提交 P
的 "sufficiently close",就其保存的源代码树而言,那么你可能只想捕获你更改的 从 A
到 B
,然后你从 B
到 C
的变化,然后你从 C
的变化到 D
。如果您按顺序将它们中的每一个堆叠在它们的提交 R
之上,并让您的 Git 记住您的副本-D
作为您的 master
,您将得到这个:
A--B--C--D [abandoned]
P--Q--R <-- origin/master
\
B'-C'-D' <-- master
其中 B'
是 B
的副本,C'
是 C
的副本,D'
是 [=18= 的副本].
还有更多选择
有很多方法可以组合所有这些东西。然而,将这些 返回 给 Jim,或者以其他方式共享所有这些工作的关键是让各种提交变得相关。您需要有一些共同的提交——在某个点上,当我们绘制这些提交图时,在提交时将提交连接到其父项 "join up" 的箭头。一旦你有了它,剩下的就容易多了。
Jim 仍然需要授予您对 他的 存储库的写入权限,或者——就像在 GitHub 和 Bitbucket 上通常做的那样——你可以创建另一个存储库——在 Jim 可以访问的服务器上(在 Bitbucket 或 GitHub 上)复制。然后,您将提交推送到该服务器上的 您的 存储库,并向 Jim 发送某种警报(例如电子邮件),告诉他 "I have new commits in my widely-accessible repository, that you can fetch and merge into your widely-accessible repository. Please pull them at your convenience." 我们通常称这些为 pull requests,如果你使用其中一些网站上的一些 "fork a repository" 按钮,它们会自动完成你需要做的大部分工作,以将这些警报传递给其他人或组(我在这里一直叫 "Jim" 的那个)。
尽管如此,在所有情况下,您的第一步是做 某事 以便您的提交与 parent/child linkage 相关联提交。确切地说,您想在这里做什么取决于您。请注意,如果您不确定该怎么做,您可以随时克隆当前的克隆,随心所欲地摆弄它,然后看看您是否喜欢 结果。如果没有,您可以 删除 那个克隆并再次重新克隆当前克隆并与新克隆混淆。这为您提供了一种简单的方法来测试每条路径。
(有很多方法可以在不克隆你的克隆的情况下做到这一点——Git 在不 丢失 提交方面非常好——但它们可能很棘手,因为如果你 讨厌结果并想失去它,好吧,Git对不丢失提交非常好,这使得丢失它们非常糟糕. 在单独的克隆副本中工作使所有这些担忧都消失了 window。)