我有一个名为app.js的主分支。我在一个实验分支上对这个文件进行了更改。

我只想将实验中对app.js所做的更改应用到master分支。


当前回答

有关在git中签出文件或目录的所有信息

1.如何从另一个分支签出一个或多个文件或目录,或将哈希提交到当前签出的分支:

# check out all files in <paths> from branch <branch_name>
git checkout <branch_name> -- <paths>

资料来源:http://nicolasgallagher.com/git-checkout-specific-files-from-another-branch/.

另请参见man git结帐。

示例:

# Check out "somefile.c" from branch `my_branch`
git checkout my_branch -- somefile.c

# Check out these 4 files from `my_branch`
git checkout my_branch -- file1.h file1.cpp mydir/file2.h mydir/file2.cpp

# Check out ALL files from my_branch which are in
# directory "path/to/dir"
git checkout my_branch -- path/to/dir

如果未指定,则会自动将其branch_name假定为HEAD,这是当前签出分支的最近一次提交。因此,您也可以这样做以签出“somefile.c”,并让它覆盖任何本地未提交的更改:

# Check out "somefile.c" from `HEAD`, to overwrite any local, uncommitted
# changes
git checkout -- somefile.c

# Or check out a whole folder from `HEAD`:
git checkout -- some_directory

2.进一步:如何从任何分支检出任何文件或将哈希提交到计算机上的任何位置(非常有用!):

# General form
git show my_branch_or_commit_hash:my_file.cpp > any/path/my_file.cpp

# Example: check out `main.cpp` from 3 commits ago in your currently-checked-out
# branch (3 commits prior to `HEAD`, or `HEAD~3`) into a temporary directory
mkdir ../temp
git show HEAD~3:main.cpp > ../temp/main_old.cpp

我了解到这一点的来源:@Jakub Narûbski对以下问题的回答:git以新名称签出文件的旧版本

3.如果您正在解决git合并、git cherry-pick、git rebase或git恢复更改,该怎么办?

好吧,在这种情况下,你最好做以下事情。注意:要知道每个上下文中的提交哈希或分支(他们的和我们的)是什么,请看我的答案:根据Git,谁是“我们”?谁是“他们”?:

# Keep `--theirs` for all conflicts within this file
git checkout --theirs -- path/to/some/file
# OR: keep `--ours` for all conflicts within this file
git checkout --ours -- path/to/some/file

OR:

# Keep `--theirs` for all conflicts within files inside this dir
git checkout --theirs -- path/to/some/dir
# OR: keep `--ours` for all conflicts within files inside this dir
git checkout --ours -- path/to/some/dir

在此之前,不要执行上一节中的常规结账表单,除非这是你真正想做的。请参阅上面提到的我的回答中的“警告警告”部分:根据Git,谁是“我们”,谁是”他们“?。

处理路径没有我们的版本或路径没有它们的版本错误:

如果您看到过这样的错误:

错误:路径“path/to/some/dir/file1.cpp”没有我们的版本#或错误:路径“path/to/some/dir/file1.cpp”没有其版本

…当运行上面的命令时,您只需先git rm这些文件,然后再次尝试git checkout(我们的或git checkout-他们的命令)。有关这些命令的详细解释,请参阅我的回答,包括一个自动查找和删除这些错误文件的表单:gitcheckout——当文件规范包含已删除文件时,我们的。

4.如果您想重置某个文件或目录,以在另一个提交或分支中完全匹配该文件或目录的状态,该怎么办?

在这种情况下,git checkout my_branch--some_file_or_dir是不够的,因为如果指定目录中的文件存在于当前签出的分支或提交中,但不存在于my_brank中,那么您希望在本地删除这些文件,但是git checkout不会删除任何存在于本地但不在指定提交中的文件,它只使用指定提交的版本在本地覆盖文件。因此,要在本地删除不应该存在的文件,以便您在本地得到的是提交或分支my_branch上的文件的精确副本,您必须执行以下操作:

# How to "hard reset" "path/to/some/file_or_dir" to its state exactly as it was
# at commit or branch `my_branch`
#
# WARNING: `git status` should be TOTALLY CLEAN before beginning this process!
# Otherwise, you risk PERMANENTLY LOSING any uncommitted changes shown by 
# `git status`, since `git clean -fd` 'f'orce deletes ALL files
# and 'd'irectories which are in your current working tree (file system), but
# which are *not* in the path you specify below in commit or branch `my_branch`.
# Therefore, anything NOT already committed gets **permanently lost** as though
# you had used `rm` on it!

git reset my_branch -- path/to/some/file_or_dir
git checkout-index -fa
git clean -fd  # SEE WARNING ABOVE!
git commit -m "hard reset path/to/some/file_or_dir to its state \
as it was at my_branch"

关于这一点,请参阅我自己的答案:为什么git不能按路径进行硬/软重置?

另请参见:

快速链接到我经常引用的答案,并认为是“git基础知识”:从另一个分支在git中创建分支的各种方法有关在git中签出文件或目录的所有信息根据Git,谁是“我们”?谁是“他们”?我在这里的回答中展示了更多的git结账示例:根据git,谁是“我们”,谁是”他们“?。[我对“如何按路径执行--soft或--hard git重置”的回答]为什么git不能按路径执行硬/软重置?git以新名称签出文件的旧版本[我的答案]git checkout--当文件规范包含删除的文件时[我的答案]使用git,如何将工作树(本地文件系统状态)重置为索引的状态(“暂存”文件)?

其他回答

查看github上的文件并从那里取出

这是一种务实的方法,不会直接回答OP,但有些人发现很有用:

如果有问题的分支位于GitHub上,那么您可以使用GitHub提供的许多工具中的任何一个导航到所需的分支和文件,然后单击“原始”查看纯文本,并(可选)根据需要复制和粘贴文本。

我喜欢这种方法,因为它允许您在将远程文件拉到本地计算机之前查看其完整性。

对于所有喜欢避免未知的git命令或害怕破坏某些东西的人,还有一个简单的解决方案:

检查文件所在的分支将该文件复制到计算机上的其他位置签出到文件需要到达的分支将文件粘贴到位

可能需要比相应的git命令更长的时间。。。但它有效且易于理解

git checkout <branch_name> -- <paths>

更多信息

git checkout master               -go to the master branch first
git checkout <your-branch> -- <your-file> --copy your file data from your branch.

git show <your-branch>:path/to/<your-file> 

希望这对你有所帮助。如果你有任何疑问,请告诉我。

有关在git中签出文件或目录的所有信息

1.如何从另一个分支签出一个或多个文件或目录,或将哈希提交到当前签出的分支:

# check out all files in <paths> from branch <branch_name>
git checkout <branch_name> -- <paths>

资料来源:http://nicolasgallagher.com/git-checkout-specific-files-from-another-branch/.

另请参见man git结帐。

示例:

# Check out "somefile.c" from branch `my_branch`
git checkout my_branch -- somefile.c

# Check out these 4 files from `my_branch`
git checkout my_branch -- file1.h file1.cpp mydir/file2.h mydir/file2.cpp

# Check out ALL files from my_branch which are in
# directory "path/to/dir"
git checkout my_branch -- path/to/dir

如果未指定,则会自动将其branch_name假定为HEAD,这是当前签出分支的最近一次提交。因此,您也可以这样做以签出“somefile.c”,并让它覆盖任何本地未提交的更改:

# Check out "somefile.c" from `HEAD`, to overwrite any local, uncommitted
# changes
git checkout -- somefile.c

# Or check out a whole folder from `HEAD`:
git checkout -- some_directory

2.进一步:如何从任何分支检出任何文件或将哈希提交到计算机上的任何位置(非常有用!):

# General form
git show my_branch_or_commit_hash:my_file.cpp > any/path/my_file.cpp

# Example: check out `main.cpp` from 3 commits ago in your currently-checked-out
# branch (3 commits prior to `HEAD`, or `HEAD~3`) into a temporary directory
mkdir ../temp
git show HEAD~3:main.cpp > ../temp/main_old.cpp

我了解到这一点的来源:@Jakub Narûbski对以下问题的回答:git以新名称签出文件的旧版本

3.如果您正在解决git合并、git cherry-pick、git rebase或git恢复更改,该怎么办?

好吧,在这种情况下,你最好做以下事情。注意:要知道每个上下文中的提交哈希或分支(他们的和我们的)是什么,请看我的答案:根据Git,谁是“我们”?谁是“他们”?:

# Keep `--theirs` for all conflicts within this file
git checkout --theirs -- path/to/some/file
# OR: keep `--ours` for all conflicts within this file
git checkout --ours -- path/to/some/file

OR:

# Keep `--theirs` for all conflicts within files inside this dir
git checkout --theirs -- path/to/some/dir
# OR: keep `--ours` for all conflicts within files inside this dir
git checkout --ours -- path/to/some/dir

在此之前,不要执行上一节中的常规结账表单,除非这是你真正想做的。请参阅上面提到的我的回答中的“警告警告”部分:根据Git,谁是“我们”,谁是”他们“?。

处理路径没有我们的版本或路径没有它们的版本错误:

如果您看到过这样的错误:

错误:路径“path/to/some/dir/file1.cpp”没有我们的版本#或错误:路径“path/to/some/dir/file1.cpp”没有其版本

…当运行上面的命令时,您只需先git rm这些文件,然后再次尝试git checkout(我们的或git checkout-他们的命令)。有关这些命令的详细解释,请参阅我的回答,包括一个自动查找和删除这些错误文件的表单:gitcheckout——当文件规范包含已删除文件时,我们的。

4.如果您想重置某个文件或目录,以在另一个提交或分支中完全匹配该文件或目录的状态,该怎么办?

在这种情况下,git checkout my_branch--some_file_or_dir是不够的,因为如果指定目录中的文件存在于当前签出的分支或提交中,但不存在于my_brank中,那么您希望在本地删除这些文件,但是git checkout不会删除任何存在于本地但不在指定提交中的文件,它只使用指定提交的版本在本地覆盖文件。因此,要在本地删除不应该存在的文件,以便您在本地得到的是提交或分支my_branch上的文件的精确副本,您必须执行以下操作:

# How to "hard reset" "path/to/some/file_or_dir" to its state exactly as it was
# at commit or branch `my_branch`
#
# WARNING: `git status` should be TOTALLY CLEAN before beginning this process!
# Otherwise, you risk PERMANENTLY LOSING any uncommitted changes shown by 
# `git status`, since `git clean -fd` 'f'orce deletes ALL files
# and 'd'irectories which are in your current working tree (file system), but
# which are *not* in the path you specify below in commit or branch `my_branch`.
# Therefore, anything NOT already committed gets **permanently lost** as though
# you had used `rm` on it!

git reset my_branch -- path/to/some/file_or_dir
git checkout-index -fa
git clean -fd  # SEE WARNING ABOVE!
git commit -m "hard reset path/to/some/file_or_dir to its state \
as it was at my_branch"

关于这一点,请参阅我自己的答案:为什么git不能按路径进行硬/软重置?

另请参见:

快速链接到我经常引用的答案,并认为是“git基础知识”:从另一个分支在git中创建分支的各种方法有关在git中签出文件或目录的所有信息根据Git,谁是“我们”?谁是“他们”?我在这里的回答中展示了更多的git结账示例:根据git,谁是“我们”,谁是”他们“?。[我对“如何按路径执行--soft或--hard git重置”的回答]为什么git不能按路径执行硬/软重置?git以新名称签出文件的旧版本[我的答案]git checkout--当文件规范包含删除的文件时[我的答案]使用git,如何将工作树(本地文件系统状态)重置为索引的状态(“暂存”文件)?