如何将文件从 master 分支推送到另一个分支?
How to push files from master branch to another branch?
我对使用 git 还很陌生,所以我需要将文件从 master 分支推送到另一个分支,以便在出现问题时进行备份,然后继续在 master 分支上工作。我如何在 git bash 中做到这一点?
Git 不推送 文件; Git 推送 提交 。提交包含文件,所以效果相似,但记住这一点很重要:存储库要么 有 提交(然后有每个文件的快照),要么没有没有提交(然后它没有那些快照)。
将你在 master
上的提交推送到其他 Git 存储库——你称之为 origin
的存储库——但是让其他存储库通过名称不是(它的)master
,你可以这样做:
git push origin master:some-new-branch-name
这会发送给他们——origin
上的 Git——你拥有的任何提交,他们没有(但确实需要)。然后它向他们发送一个礼貌的请求:请将你的分支设置为 some-new-branch-name
以便它记住我调用的提交 master
。
(您的 Git 向他们发送此提交的原始哈希 ID,而不是名称 master
。如果愿意,您可以查看原始哈希 ID:
git rev-parse master
虽然在您查看了一些原始哈希 ID 之后,您很快就会明白为什么人们不经常使用它们。除非你剪切并粘贴它们,否则它们太难正确了。)
完成以上操作后,如果你运行:
git fetch origin
您将看到您现在有了一个新的 远程跟踪名称 origin/some-new-branch-name
。这是您的 Git 对他们的—起源的—Git 的分支名称 some-new-branch-name
的副本。如果你 运行:
git log --all --decorate --oneline --graph
您会看到,您不仅拥有这个新名称,而且它还标识了与您自己的 master
.
完全相同的提交
所有这些都有些愚蠢 and/or 矫枉过正,除非您担心您所做的某些事情实际上会破坏您的 存储库 。原因是提交一旦完成,就是永久性的——好吧,大部分是永久性的——而且是只读的(完全只读:nothing 在任何commit 可以 ever 被改变!)。提交本身实际上是通过哈希 ID 找到的。像 master
这样的分支名称只是作为 起点: 你的 Git 将你的名字 master
翻译成一个丑陋的大哈希 ID,并使用它找到 last 提交。最后一次提交具有其先前或 parent 提交的丑陋大哈希 ID,因此从最后一次提交开始,您的 Git 可以倒退一步。父提交存储另一个父哈希 ID,因此从父提交,您的 Git 可以向后移动另一步。该提交还有另一个父 ID:
... <-F <-G <-H ...
给定任何提交哈希 ID,例如提交 H
,Git 可以读取提交并获取其父 ID。然后它可以读取 G
并获得另一个父 ID,它可以用来读取 F
,等等。 这就是分支:它只是一系列提交,st运行g 通过哈希 ID 反向组合在一起,分支 name 指向 系列中的最后一个 。如果 H
是最后一次提交,则该系列看起来像这样:
...--F--G--H <-- master
名称 master
让您的 Git 找到提交 H
。这让您的 Git 找到 G
,然后 F
,依此类推。
当您向 master
添加新提交时,Git 真正做的是写出一个新提交(带有一些新的随机哈希 ID),其 parent 是提交 H
。然后 Git 将新提交的哈希 ID——我们称它为 I
——写入名称 master
,现在你有:
...--F--G--H--I <-- master
当您创建一个新的 name 时,例如 some-new-branch-name
,Git 只是创建该名称,指向某个现有的提交。默认情况下,新名称的提交是 current 提交:
...--F--G--H--I <-- master, some-new-branch-name
这也解释了 Git 的 HEAD
是关于什么的。如果您有多个分支名称,那么 Git 如何知道在您进行新提交时 更新 哪个名称?答案是:Git 将特殊名称 HEAD
附加到分支名称之一。这是您进行新提交时要更新的名称。所以我们真的应该把它画成:
...--F--G--H--I <-- master (HEAD), some-new-branch-name
或:
...--F--G--H--I <-- master, some-new-branch-name (HEAD)
取决于您使用 git checkout
选择的 分支名称 。当前commit是I
(的真实hash ID);当前 分支名称 是附加到 HEAD
的名称。
如果您担心文件,只需使用 git checkout -b
创建一个新的分支名称,如果需要,提交(如果您希望先将更改添加到另一个分支,则先提交,如果这样比较合适)。您以前的分支名称现在会记住 its 上次提交的哈希 ID,而您的新分支名称会记住您所做的任何 new 提交的哈希 ID:
...--F--G--H--I <-- master
\
J--K <-- some-new-branch-name (HEAD)
(一旦你有两个只在新分支上的提交)。
(请注意,通过 I
的提交在 两个 分支上。)
首先,您需要为这些备份创建一个新分支(但我认为没有必要这样做,因为您也可以返回在 master 分支中所做的任何提交,但是可以)。
正在本地创建新分支
要创建一个新分支只需使用:
git branch <NAME OF NEW BRANCH>
或者在这种情况下,我们可以使用
git branch backup
之后,我们需要切换到那个分支
git checkout <NAME OF NEW BRANCH>
或者在这种情况下,我们将使用
git checkout backup
之后,我们需要提交更改
添加所有新文件(点替换当前未添加到提交的所有文件)
git add .
并进行提交
git commit -m "adding a backup branch"
然后我们去master分支
git checkout master
然后将这些更改推送到 git 存储库
git push origin <feature_branch>
在这种情况下
git push origin backup
正在将新文件从主分支推送到备份分支
如果你想在分支备份中以新文件为基础,你可以使用
git rebase master
这将更新您在备份分支中的基本提交。你可以在这里阅读更多关于变基的信息 https://git-scm.com/book/de/v2/Git-Branching-Rebasing
我对使用 git 还很陌生,所以我需要将文件从 master 分支推送到另一个分支,以便在出现问题时进行备份,然后继续在 master 分支上工作。我如何在 git bash 中做到这一点?
Git 不推送 文件; Git 推送 提交 。提交包含文件,所以效果相似,但记住这一点很重要:存储库要么 有 提交(然后有每个文件的快照),要么没有没有提交(然后它没有那些快照)。
将你在 master
上的提交推送到其他 Git 存储库——你称之为 origin
的存储库——但是让其他存储库通过名称不是(它的)master
,你可以这样做:
git push origin master:some-new-branch-name
这会发送给他们——origin
上的 Git——你拥有的任何提交,他们没有(但确实需要)。然后它向他们发送一个礼貌的请求:请将你的分支设置为 some-new-branch-name
以便它记住我调用的提交 master
。
(您的 Git 向他们发送此提交的原始哈希 ID,而不是名称 master
。如果愿意,您可以查看原始哈希 ID:
git rev-parse master
虽然在您查看了一些原始哈希 ID 之后,您很快就会明白为什么人们不经常使用它们。除非你剪切并粘贴它们,否则它们太难正确了。)
完成以上操作后,如果你运行:
git fetch origin
您将看到您现在有了一个新的 远程跟踪名称 origin/some-new-branch-name
。这是您的 Git 对他们的—起源的—Git 的分支名称 some-new-branch-name
的副本。如果你 运行:
git log --all --decorate --oneline --graph
您会看到,您不仅拥有这个新名称,而且它还标识了与您自己的 master
.
所有这些都有些愚蠢 and/or 矫枉过正,除非您担心您所做的某些事情实际上会破坏您的 存储库 。原因是提交一旦完成,就是永久性的——好吧,大部分是永久性的——而且是只读的(完全只读:nothing 在任何commit 可以 ever 被改变!)。提交本身实际上是通过哈希 ID 找到的。像 master
这样的分支名称只是作为 起点: 你的 Git 将你的名字 master
翻译成一个丑陋的大哈希 ID,并使用它找到 last 提交。最后一次提交具有其先前或 parent 提交的丑陋大哈希 ID,因此从最后一次提交开始,您的 Git 可以倒退一步。父提交存储另一个父哈希 ID,因此从父提交,您的 Git 可以向后移动另一步。该提交还有另一个父 ID:
... <-F <-G <-H ...
给定任何提交哈希 ID,例如提交 H
,Git 可以读取提交并获取其父 ID。然后它可以读取 G
并获得另一个父 ID,它可以用来读取 F
,等等。 这就是分支:它只是一系列提交,st运行g 通过哈希 ID 反向组合在一起,分支 name 指向 系列中的最后一个 。如果 H
是最后一次提交,则该系列看起来像这样:
...--F--G--H <-- master
名称 master
让您的 Git 找到提交 H
。这让您的 Git 找到 G
,然后 F
,依此类推。
当您向 master
添加新提交时,Git 真正做的是写出一个新提交(带有一些新的随机哈希 ID),其 parent 是提交 H
。然后 Git 将新提交的哈希 ID——我们称它为 I
——写入名称 master
,现在你有:
...--F--G--H--I <-- master
当您创建一个新的 name 时,例如 some-new-branch-name
,Git 只是创建该名称,指向某个现有的提交。默认情况下,新名称的提交是 current 提交:
...--F--G--H--I <-- master, some-new-branch-name
这也解释了 Git 的 HEAD
是关于什么的。如果您有多个分支名称,那么 Git 如何知道在您进行新提交时 更新 哪个名称?答案是:Git 将特殊名称 HEAD
附加到分支名称之一。这是您进行新提交时要更新的名称。所以我们真的应该把它画成:
...--F--G--H--I <-- master (HEAD), some-new-branch-name
或:
...--F--G--H--I <-- master, some-new-branch-name (HEAD)
取决于您使用 git checkout
选择的 分支名称 。当前commit是I
(的真实hash ID);当前 分支名称 是附加到 HEAD
的名称。
如果您担心文件,只需使用 git checkout -b
创建一个新的分支名称,如果需要,提交(如果您希望先将更改添加到另一个分支,则先提交,如果这样比较合适)。您以前的分支名称现在会记住 its 上次提交的哈希 ID,而您的新分支名称会记住您所做的任何 new 提交的哈希 ID:
...--F--G--H--I <-- master
\
J--K <-- some-new-branch-name (HEAD)
(一旦你有两个只在新分支上的提交)。
(请注意,通过 I
的提交在 两个 分支上。)
首先,您需要为这些备份创建一个新分支(但我认为没有必要这样做,因为您也可以返回在 master 分支中所做的任何提交,但是可以)。
正在本地创建新分支
要创建一个新分支只需使用:
git branch <NAME OF NEW BRANCH>
或者在这种情况下,我们可以使用
git branch backup
之后,我们需要切换到那个分支
git checkout <NAME OF NEW BRANCH>
或者在这种情况下,我们将使用
git checkout backup
之后,我们需要提交更改
添加所有新文件(点替换当前未添加到提交的所有文件)
git add .
并进行提交
git commit -m "adding a backup branch"
然后我们去master分支
git checkout master
然后将这些更改推送到 git 存储库
git push origin <feature_branch>
在这种情况下
git push origin backup
正在将新文件从主分支推送到备份分支
如果你想在分支备份中以新文件为基础,你可以使用
git rebase master
这将更新您在备份分支中的基本提交。你可以在这里阅读更多关于变基的信息 https://git-scm.com/book/de/v2/Git-Branching-Rebasing