git - 如何将文件从master分支推送到另一个分支?

标签 git git-branch git-bash

我刚开始使用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的分支,以便它记住我调用的提交。
(git向它们发送此提交的原始散列id,而不是名称master。如果愿意,可以使用以下命令查看原始哈希ID:
git rev-parse master

尽管在您查看了一些原始散列ID之后,您很快就会明白为什么人类不经常使用它们。除非你把它们剪贴起来,否则它们很难纠正。)
完成上述操作后,如果您运行:
git fetch origin

您将看到您现在有了一个新的远程跟踪名称master。这是您git的原始git分支名称的副本。如果你跑步:
git log --all --decorate --oneline --graph

您将看到,不仅您有了这个新名称,而且它标识了与您自己的origin/some-new-branch-name完全相同的提交。
所有这些都是有点愚蠢和/或过分杀戮,除非你担心你所做的事情实际上会破坏你在这里的存储库。原因是,一旦提交,就可以是永久的,大部分是永久的和只读的(完全只读的:任何提交中的任何内容都不能更改!)。提交本身实际上是通过hash id找到的。像some-new-branch-name这样的分支名称只是作为起点:您的git将您的名称master转换为一个大而难看的hash id,并使用它来查找最后一次提交。最后一次提交具有其前一次提交或父次提交的丑陋哈希ID,因此从最后一次提交开始,Git可以向后退一步。parent commit存储另一个父散列id,这样git就可以从父散列id向后移动一步。该提交还有另一个父ID:
... <-F <-G <-H ...

给定任何提交散列id,比如commitmaster,git可以读取提交并获取其父id,然后读取master并获取另一个父id,它可以使用该id读取H,依此类推。分支就是这样的:它只是一系列提交,由哈希ID向后排列,分支名称指向系列中的最后一个。如果G是最后一次提交,则序列如下:
...--F--G--H   <-- master

名称F允许git查找commitH。它让您的git找到master,然后找到H,依此类推。
当您向G添加一个新的提交时,git真正做的是写出一个新的提交(带有一些新的随机散列id),其父级是commitF。然后git将新提交的hash id(我们称之为master)写入名称H,现在您有:
...--F--G--H--I   <-- master

当你创建一个新的名字,比如I,Git只是创建这个名字,指向一些现有的提交。默认情况下,新名称的提交是当前提交:
...--F--G--H--I   <-- master, some-new-branch-name

这也解释了gitmaster的含义。如果您有多个分支名称,那么git如何知道在进行新提交时要更新哪个名称?答案是:git将特殊名称some-new-branch-name附加到一个分支名称。这是进行新提交时要更新的名称。所以我们应该把它画成:
...--F--G--H--I   <-- master (HEAD), some-new-branch-name

或:
...--F--G--H--I   <-- master, some-new-branch-name (HEAD)

取决于您使用HEAD选择的分支名称。当前提交是(的实际哈希ID)HEAD;当前分支名称是附加到的名称。
如果您担心文件,只需使用git checkout创建一个新的分支名称,如果需要,提交(如果您希望先将更改添加到另一个分支,如果更合适,请先提交)。以前的分支名称现在会记住上次提交的哈希ID,而新的分支名称会记住您进行的任何新提交的哈希ID:
...--F--G--H--I   <-- master
               \
                J--K   <-- some-new-branch-name (HEAD)

(只有在新分支上有两个提交之后)。
(注意,通过I的提交在两个分支上。)

关于git - 如何将文件从master分支推送到另一个分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57321871/

相关文章:

linux - 致命的无法找到 https 的远程助手

GitHub:抱歉,此差异不可用(fork 已删除)

git - 反转 git 分支之间的关系

windows - 为什么 git bash 在 PyCharm 上表现怪异?

windows - 无法在git bash中输入字符

git merge 不添加新文件

git - git 中的 HEAD 是什么?

git - 如何列出包含比特定日期更新的提交的所有分支?

本地克隆未知的 Git 分支

linux - 基于 Bash 的热重载实现