复制一个未跟踪的文件夹到另一个分支

7

有没有办法将未跟踪的文件夹复制到另一个分支?

我知道你可以通过执行以下操作将已跟踪的文件夹复制到另一个分支:

git checkout mybranch
git checkout master -- myfolder

但是,有没有一种方法可以复制一个在主分支上未被跟踪,但在我想要复制到的分支上已被跟踪的文件夹?

我正在尝试为GitHub页面做这个操作,并且遵循这个指南,但他将更改提交到主分支并将其推送到上游gh-pages。我不想这样做。我只想让我的构建生成文档并将未被跟踪的文档复制到另一个分支,然后将它们推送到上游。

3个回答

3
您面临的情况是,在另一个分支中有一些与未跟踪文件冲突的已跟踪文件,您想切换到该分支,但使用“checkout”命令将无法切换。在git中,“第一级”解决方案是将这些未跟踪文件提升到索引中:
git add folder

现在你仍然无法将更改检出到分支。但是,你有一个新的选择:你可以使用git stash save命令来保存更改:

git stash save

现在你可以切换到该分支,并执行git stash pop。此时,如果有任何合并冲突,您可以处理它们,然后进行git reset,然后就完成了。
[更新:不需要git add,因为git stash有一个选项可以包括未跟踪的文件!]
让我们通过一个完整的示例来演示,涉及一个名为topicfile的单个文件,该文件仅存在于一个分支中,并且在master上作为工作文件创建,但具有不同的内容:
~$ mkdir gittest
~$ cd gittest/
~/gittest$ git init
Initialized empty Git repository in /home/kaz/gittest/.git/
~/gittest$ touch emptyfile
~/gittest$ git add emptyfile
~/gittest$ git commit -m "starting repo"
[master (root-commit) 75ea7cd] starting repo
 0 files changed
 create mode 100644 emptyfile
~/gittest$ git branch
* master
~/gittest$ git checkout -b topic
Switched to a new branch 'topic'
~/gittest$ cat > topicfile
a
b
c
d
e
~/gittest$ git add topicfile
~/gittest$ git commit -m "topicfile"
[topic 875efc5] topicfile
 1 file changed, 5 insertions(+)
 create mode 100644 topicfile
~/gittest$ git checkout master
Switched to branch 'master'
~/gittest$ ls
emptyfile
~/gittest$ cat > topicfile
@
a
b
c
d
e
f
g
h
~/gittest$ git add topicfile
~/gittest$ git stash save topicfile
Saved working directory and index state On master: topicfile
HEAD is now at 75ea7cd starting repo
~/gittest$ git checkout topic
Switched to branch 'topic'
~/gittest$ git stash pop
Auto-merging topicfile
CONFLICT (add/add): Merge conflict in topicfile
~/gittest$ cat topicfile
<<<<<<< Updated upstream
=======
@
>>>>>>> Stashed changes
a
b
c
d
e
<<<<<<< Updated upstream
=======
f
g
h
>>>>>>> Stashed changes
~/gittest$ cat > topicfile  # resolve in favor of stashed changes:
@
a
b
c
d
e
f
g
h
~/gittest$ git add topicfile
~/gittest$ git reset
Unstaged changes after reset:
M       topicfile
~/gittest$ git diff
diff --git a/topicfile b/topicfile
index 9405325..bea0ebb 100644
--- a/topicfile
+++ b/topicfile
@@ -1,5 +1,9 @@
+@
 a
 b
 c
 d
 e
+f
+g
+h

此时,我们可以将topicfile的更改提交到topic分支,而该文件仍未被跟踪到master
因为在git stash pop中存在冲突,所以存储仍然存在。我们可以使用git stash drop来清除它。
另一种方法是不仅将未跟踪的文件添加到索引中,还要使用git commit进行适当的提交。然后我们可以将此提交挑选到分支中。如果我们不想在master上跟踪这些文件,那么没关系:稍后我们可以使用git reset --hard HEAD^在master上消除该提交。

没想到可以用 git stash 做这个。谢谢你的建议。 - risto

0
如果文件夹未被跟踪,则可以简单地checkout另一个分支,未被跟踪的目录不会受到影响。

但是它被跟踪在另一个分支上,所以那样行不通 :( - risto
哦,我明白了。我不知道有什么优雅的方法可以做到这一点。一个解决方法是以下七个步骤:(1)将您的目录重命名为任何一个分支都没有跟踪的名称,(2)构建文档,(3)切换到另一个分支,(4)手动复制文件,(5)git add,commit和push,(6)切换回原始分支,(7)将目录重命名为原始名称。 - Thomas Schreiter
是的,我之前就是这样做的,但感觉很不专业。 - risto

0

如果您在此处是因为您正在尝试将Sphinx文档推送到未跟踪的docs/_build文件夹并将其推送到gh-pages分支,请看看我在GitHub Action中所做的操作:

      - name: Init new repo in dist folder and commit generated files
        run: |
          cd docs/build/html/
          git init
          touch .nojekyll
          git add -A
          git config --local user.email "action@github.com"
          git config --local user.name "GitHub Action"
          git commit -m 'deploy'
      - name: Force push to destination branch
        uses: ad-m/github-push-action@v0.5.0
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          branch: gh-pages
          force: true
          directory: ./docs/build/html

如果我是在本地机器上工作,那么就会做类似这样的事情。

cd docs/_build/html/
#git init #run first time only
#touch .nojekyll #run first time only
git add -A
git commit -m 'deploy'
git push -f <url of the repo on GitHub> master:gh-pages
cd ../../..
git fetch --all
git checkout gh-pages # now update the local gh-pages branch
git pull

第一次,Git 抱怨 origin/gh-pages 和 local/gh-pages 的历史不兼容,所以我做了这个。我备份了 gh-pages,因为我总是有点害怕使用 git reset --hard。
git branch backup-ghp
git reset --hard origin/gh-pages

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接