我刚开始使用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查找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
这也解释了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/