如何将文件从 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 选择的 分支名称 。当前commitI(的真实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