我对使用git相当陌生,因此我需要将文件从master分支推送到另一个分支,以便在出现问题时进行备份,然后继续在master分支上工作。我该如何在git bash中做到这一点?
答案 0 :(得分:4)
Git不会推送文件; Git会推送 commits 。提交包含文件,因此效果类似,但请记住这一点很重要:存储库要么有个提交(然后有每个文件的快照),要么它没有提交(然后它没有那些快照)。
要将master
上的提交推送到其他Git存储库(您称为origin
的那个存储库),但要让其他存储库以(其)名称以外的名称知道它们master
,您可以执行以下操作:
git push origin master:some-new-branch-name
这会将它们(即origin
上的Git over)发送给您,它们所具有的,它们没有(但确实需要)的任何提交。然后向他们发送一个礼貌的请求:请设置您的分支机构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
。
除非您担心您所做的事情实际上会破坏您的存储库,否则所有这一切都有点愚蠢和/或过度杀伤力。原因是提交后的提交是永久性的-好吧,主要是是永久性的,并且是只读的(完全只读:什么在任何提交中都不能 进行更改!)。提交本身实际上是通过哈希ID找到的。像master
这样的分支名称只是的起点。您的Git会将您的名字master
转换成一个丑陋的哈希ID,然后使用它来查找 last 提交。最后的提交具有先前或 parent 提交的丑陋的哈希ID,因此从最后一次提交开始,您的Git可以向后退一步。父提交将存储另一个父哈希ID,因此Git可以从父提交向后移动另一步。该提交还有另一个父ID:
... <-F <-G <-H ...
给出任何提交哈希ID,就像提交H
一样,Git可以读取提交并获取其父ID。然后,它可以读取G
并获得另一个父ID,它可以用来读取F
,依此类推。 这是一个分支:这只是一系列提交,由哈希ID向后串在一起,分支 name 指向该序列中的最后一个 。如果H
是最后一次提交,则序列如下:
...--F--G--H <-- master
名称 master
让您的Git查找提交H
。这样一来,您的Git可以先找到G
,然后找到F
,依此类推。
当您向master
添加新的提交时,Git真正在做的是写出一个新的提交(带有一些新的随机散列ID),其 parent 是commit {{ 1}}。然后,Git将新提交的哈希ID(我们将其称为H
)写入名称I
,现在您拥有:
master
当您创建新的名称时,例如...--F--G--H--I <-- master
,Git只会创建该名称,指向一些现有的提交。默认情况下,新名称的提交是 current 提交:
some-new-branch-name
这也解释了Git ...--F--G--H--I <-- master, some-new-branch-name
的含义。如果您有多个分支名称,那么当您进行新的提交时,Git如何知道要 update 使用哪个名称?答案是:Git将特殊名称HEAD
附加到分支名称之一。这是您进行新提交时要更新的名称。所以我们真的应该这样画:
HEAD
或:
...--F--G--H--I <-- master (HEAD), some-new-branch-name
取决于您使用...--F--G--H--I <-- master, some-new-branch-name (HEAD)
选择的分支名称。当前的 commit 是git checkout
(的真实哈希ID);当前的分支名称是附加了名称I
的那个。
如果您担心文件,只需使用HEAD
命名一个新的分支名称,然后在需要时进行提交(如果要先将更改添加到另一个分支,则首先提交,如果更多)适当)。现在,您以前的分支名称会记住其上次提交的哈希ID,而您的新分支名称会记住您进行的任何 new 提交的哈希ID:
git checkout -b
(一旦您有两次仅在新分支上的提交)。
(请注意,通过...--F--G--H--I <-- master
\
J--K <-- some-new-branch-name (HEAD)
进行的提交在两个分支上。)
答案 1 :(得分:2)
首先,您需要为这些备份创建一个新分支(但是我认为不需要这样做,因为您也可以返回在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 repo
git push origin <feature_branch>
在这种情况下
git push origin backup
将新文件从master推送到备份分支
如果要在分支备份中将新文件作为基础,则可以使用
git rebase master
这将更新您在备份分支中的基本提交。您可以在https://git-scm.com/book/de/v2/Git-Branching-Rebasing
上了解更多有关变基的信息