如何僅從另外一個分支獲取一個文件

我正在使用git並在master分支上工做。 該分支有一個名爲app.js的文件。 html

我有一個experiment分支,在其中進行了大量更改和大量提交。 如今,我但願將僅對app.js進行的全部更改從experiment轉移到master分支。 java

我怎麼作? git

再一次,我不想合併。 我只想將app.js全部更改從experiment分支帶到master分支。 app


#1樓

一切都簡單得多,爲此可使用git checkout。 ui

假設you're on master分支上, app.js from new-feature分支獲取app.js from new-feature請執行如下操做: spa

git checkout new-feature path/to/app.js

// note that there is no leading slash in the path!

這將爲您帶來所需文件的內容。 您能夠像往常同樣使用sha1的一部分而不是 新功能的 分支名稱來獲取文件,就像在特定提交中同樣。 rest


#2樓

git checkout master               # first get back to master
git checkout experiment -- app.js # then copy the version of app.js 
                                  # from branch "experiment"

另請參見git如何撤消對一個文件的更改? code


更新2019年8月,Git 2.23:使用新的git switchgit restore命令,將是: htm

git switch master
git restore -s experiment -- app.js

默認狀況下,僅還原工做樹。
若是您還想更新索引(意味着還原文件內容, 經過一個命令將其添加到索引中): 索引

git restore -s experiment --staged --worktree -- app.js
# shorter:
git restore -s experiment -WS -- app.js

正如雅庫布·納倫斯基(JakubNarębski )在評論中提到的那樣:

git show experiment:path/to/app.js > path/to/app.js

除SO問題「 如何從Git中的特定修訂版本檢索單個文件? 」中詳述的以外,該方法也能夠工做,您須要使用來自倉庫的根目錄的完整路徑。
所以,Jakub在他的示例中使用了path / to / app.js。

正如Frosty在評論中提到的那樣:

您只會獲得app.js的最新狀態

可是,對於git checkoutgit show ,您實際上能夠引用所需的任何修訂版,如SO問題「 git gui中文件的git checkout修訂版 」所示:

$ git show $REVISION:$FILENAME
$ git checkout $REVISION -- $FILENAME

$ FILENAME是版本文件的完整路徑 ,將是相同的。

$REVISION能夠如git rev-parse

experiment@{yesterday}:app.js # app.js as it was yesterday 
experiment^:app.js            # app.js on the first commit parent
experiment@{2}:app.js         # app.js two commits ago

等等。

schmijos添加了評論

您也能夠從隱藏處執行此操做:

git checkout stash -- app.js

若是您正在兩個分支上而且不想提交,這將很是有用。


#3樓

補充VonC和chhh的答案。

git show experiment:path/to/relative/app.js > app.js
# If your current working directory is relative than just use
git show experiment:app.js > app.js

要麼

git checkout experiment -- app.js

#4樓

或者,若是您但願來自另外一個分支的全部文件:

git checkout <branch name> -- .

#5樓

git checkout branch_name file_name

例:

git checkout master App.java

若是您的分支機構名稱中包含句點,則此方法將無效。

git checkout "fix.june" alive.html
error: pathspec 'fix.june' did not match any file(s) known to git.
相關文章
相關標籤/搜索