gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:52:31 25 4
gpt4 key购买 nike

我刚开始使用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,比如commit master,git可以读取提交并获取其父id,然后读取 master并获取另一个父id,它可以使用该id读取 H,依此类推。分支就是这样的:它只是一系列提交,由哈希ID向后排列,分支名称指向系列中的最后一个。如果 G是最后一次提交,则序列如下:
...--F--G--H   <-- master

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

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

这也解释了git master的含义。如果您有多个分支名称,那么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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com