在git 2.13之前,只保存多个已更改的文件中的一个文件
如何在我的分支上只隐藏多个已更改文件中的一个?
#1楼
类似的情况。 提交并意识到它不行。
git commit -a -m "message"
git log -p
根据答案,这对我有所帮助。
# revert to previous state, keeping the files changed
git reset HEAD~
#make sure it's ok
git diff
git status
#revert the file we don't want to be within the commit
git checkout specs/nagios/nagios.spec
#make sure it's ok
git status
git diff
#now go ahead with commit
git commit -a -m "same|new message"
#eventually push tu remote
git push
#2楼
在这种情况下,我git add -p
(交互式), git commit -m blah
然后在必要时存储剩下的内容。
#3楼
更新(2015年2月14日) - 我稍微重写了脚本,以便更好地处理冲突的情况,现在应该将其显示为未合并的冲突而不是.rej文件。
我经常发现做@ bukzor方法的倒数更直观。 也就是说,要进行一些更改,然后只存储那些分阶段的更改。
不幸的是,git不提供git stash --only-index或类似的东西,所以我掀起了一个脚本来做到这一点。
#!/bin/sh# first, go to the root of the git repo
cd `git rev-parse --show-toplevel`# create a commit with only the stuff in staging
INDEXTREE=`git write-tree`
INDEXCOMMIT=`echo "" | git commit-tree $INDEXTREE -p HEAD`# create a child commit with the changes in the working tree
git add -A
WORKINGTREE=`git write-tree`
WORKINGCOMMIT=`echo "" | git commit-tree $WORKINGTREE -p $INDEXCOMMIT`# get back to a clean state with no changes, staged or otherwise
git reset -q --hard# Cherry-pick the index changes back to the index, and stash.
# This cherry-pick is guaranteed to succeed
git cherry-pick -n $INDEXCOMMIT
git stash# Now cherry-pick the working tree changes. This cherry-pick may fail
# due to conflicts
git cherry-pick -n $WORKINGCOMMITCONFLICTS=`git ls-files -u`
if test -z "$CONFLICTS"; then# If there are no conflicts, it's safe to reset, so that# any previously unstaged changes remain unstaged## However, if there are conflicts, then we don't want to reset the files# and lose the merge/conflict info.git reset -q
fi
您可以将上述脚本保存为路径中某处的git-stash-index
,然后可以将其作为git stash-index调用
# <hack hack hack>
git add <files that you want to stash>
git stash-index
现在,存储包含一个新条目,该条目仅包含您已暂存的更改,并且您的工作树仍包含任何未暂存的更改。
在某些情况下,工作树更改可能取决于索引更改,因此当您隐藏索引更改时,工作树更改会发生冲突。 在这种情况下,您将获得通常使用git merge / git mergetool / etc解决的未合并冲突。
#4楼
你也可以使用git stash save -p "my commit message"
。 通过这种方式,您可以选择将哪些帅哥添加到藏匿处,也可以选择整个文件。
每个块都会提示您一些操作:
y - stash this hunkn - do not stash this hunkq - quit; do not stash this hunk or any of the remaining onesa - stash this hunk and all later hunks in the filed - do not stash this hunk or any of the later hunks in the fileg - select a hunk to go to/ - search for a hunk matching the given regexj - leave this hunk undecided, see next undecided hunkJ - leave this hunk undecided, see next hunkk - leave this hunk undecided, see previous undecided hunkK - leave this hunk undecided, see previous hunks - split the current hunk into smaller hunkse - manually edit the current hunk? - print help
#5楼
假设你有3个文件
a.rb
b.rb
c.rb
并且你想只存储b.rb和c.rb而不是a.rb
你可以做这样的事情
# commit the files temporarily you don't want to stash
git add a.rb
git commit -m "temp" # then stash the other files
git stash save "stash message"# then undo the previous temp commit
git reset --soft HEAD^
git reset
你完成了! HTH。
#6楼
当git stash -p
(或git add -p
with stash --keep-index
)太麻烦时,我发现使用diff
, checkout
和apply
更容易:
仅“隐藏”特定文件/目录:
git diff path/to/dir > stashed.diff
git checkout path/to/dir
然后是
git apply stashed.diff
#7楼
在我提交之前,有时候我在我的分支上做了一个无关的更改,我想将它移动到另一个分支并单独提交(就像master)。 我这样做:
git stash
git checkout master
git stash pop
git add <files that you want to commit>
git commit -m 'Minor feature'
git stash
git checkout topic1
git stash pop
...<resume work>...
请注意,可以删除第一个stash
和stash pop
,您可以在结帐时将所有更改传递到master
分支,但前提是没有冲突。 此外,如果您要为部分更改创建新分支,则需要存储。
假设没有冲突且没有新分支,您可以简化它:
git checkout master
git add <files that you want to commit>
git commit -m 'Minor feature'
git checkout topic1
...<resume work>...
藏匿甚至不需要......
#8楼
将以下代码保存到文件中,例如,名为stash
。 用法是stash <filename_regex>
。 参数是文件完整路径的正则表达式。 例如,要存储a / b / c.txt, stash a/b/c.txt
或stash .*/c.txt
等。
$ chmod +x stash
$ stash .*.xml
$ stash xyz.xml
要复制到文件中的代码:
#! /usr/bin/expect --
log_user 0
set filename_regexp [lindex $argv 0]spawn git stash -pfor {} 1 {} {expect {-re "diff --git a/($filename_regexp) " {set filename $expect_out(1,string)}"diff --git a/" {set filename ""}"Stash this hunk " {if {$filename == ""} {send "n\n"} else {send "a\n"send_user "$filename\n"}}"Stash deletion " {send "n\n"}eof {exit}}
}
#9楼
以防万一你实际上意味着在你使用git stash
时丢弃更改 (并且实际上并没有使用git stash暂时存储它),在这种情况下你可以使用
git checkout -- <file>
[ 注意 ]
git stash
只是分支和做事的一种快速而简单的替代方案。
#10楼
另一种方法:
# Save everything
git stash # Re-apply everything, but keep the stash
git stash applygit checkout <"files you don't want in your stash"># Save only the things you wanted saved
git stash# Re-apply the original state and drop it from your stash
git stash apply stash@{1}
git stash drop stash@{1}git checkout <"files you put in your stash">
在我(再一次)来到这个页面之后我想出了这个并且不喜欢前两个答案(第一个答案就是没有回答这个问题而且我不喜欢使用-p
交互模式) 。
这个想法与@VonC建议使用存储库外部文件的想法相同,您可以保存您想要的更改,删除存储中不需要的更改,然后重新应用您移动的更改。 但是,我使用git stash作为“某处”(结果,最后还有一个额外的步骤:删除你存放在存储中的cahnges,因为你也将它们移开了)。
#11楼
我不知道如何在命令行上执行此操作,仅使用SourceTree。 假设您已经更改了文件A,并且在文件B中有两个更改块。如果您只想隐藏文件B中的第二个块,并保持其他所有内容不变,请执行以下操作:
- 一切都好
- 对工作副本执行更改以撤消文件A中的所有更改。(例如,启动外部差异工具并使文件匹配。)
- 使文件B看起来好像只对其应用了第二个更改。 (例如,启动外部差异工具并撤消第一次更改。)
- 使用“保持暂存的更改”创建一个存储。
- 一切都在前台
- 完成!
#12楼
由于git基本上是关于管理所有存储库内容和索引(而不是一个或多个文件),因此git stash
交易毫不奇怪, 与所有工作目录 。
实际上,自Git 2.13(2017年第2季度)以来,您可以使用git stash push
存储单个文件:
git stash push [--] [<pathspec>...]
当
pathspec
被赋予'git stash push
'时,新的stash仅记录与pathspec匹配的文件的修改状态
有关更多信息,请参阅“存储对特定文件的更改 ”。
测试用例不言自明:
test_expect_success 'stash with multiple pathspec arguments' '>foo &&>bar &&>extra &&git add foo bar extra &&git stash push -- foo bar && test_path_is_missing bar &&test_path_is_missing foo &&test_path_is_file extra &&git stash pop &&test_path_is_file foo &&test_path_is_file bar &&test_path_is_file extra
最初的答案(下面,2010年6月)是关于手动选择要藏匿的内容。
Casebash评论:
这个(
stash --patch
原始解决方案)很不错,但我经常修改了很多文件所以使用补丁很烦人
bukzor的回答 (upvoted,2011年11月)提出了一个更实际的解决方案,基于
git add
+ git stash --keep-index
。
去看看并提出他的回答,这应该是正式的(而不是我的)。
关于该选项, chhh在评论中指出了另一种工作流程:
你应该在这样的藏匿之后“
git reset --soft
”来恢复你的明确阶段:
为了达到原始状态 - 这是一个明确的暂存区域,并且只有一些选择的非阶段修改,人们可以轻轻地重置索引以获取(不提交像你这样的东西 - bukzor - 确实)。
(原始答案2010年6月:手动藏匿)
然而, git stash save --patch
可以让你实现你所追求的部分git stash save --patch
:
使用
--patch
,您可以交互式地从HEAD和工作树之间的差异中选择要存储的数据。
构建存储条目,使其索引状态与存储库的索引状态相同,并且其工作树仅包含您以交互方式选择的更改。 然后,从您的工作树中回滚所选更改。
但是,这将保存完整索引(可能不是您想要的,因为它可能包括已编入索引的其他文件),以及部分工作树(可能看起来像您要隐藏的那个)。
git stash --patch --no-keep-index
可能更适合。
如果--patch
不起作用,手动过程可能会:
对于一个或多个文件,中间解决方案是:
- 将它们复制到Git仓库之外
(实际上, eleotlecram提出了一个有趣的选择 ) git stash
- 把它们复制回来
git stash
#这次,只有你想要的文件被存储起来git stash pop stash@{1}
#重新应用所有文件修改git checkout -- afile
#在任何本地修改之前将文件重置为HEAD内容
在相当繁琐的过程结束时,您将只有一个或几个文件被藏起来。
#13楼
当您尝试在两个分支之间切换时,会出现这种情况。
尝试使用“ git add filepath
”添加文件。
稍后执行此行
git stash --keep-index
#14楼
使用SourceTree可以在3个步骤中轻松完成。
- 暂时提交你不想藏的东西。
- Git添加其他所有内容,然后存储它。
- 通过运行git reset来弹出临时提交,在临时提交之前定位提交。
这可以在SourceTree中在几秒钟内完成,您可以在其中单击要添加的文件(甚至是单独的行)。 添加后,只需将它们提交给临时提交。 接下来,单击复选框以添加所有更改,然后单击存储以存储所有内容。 通过隐藏的更改,浏览提交列表并在临时提交之前记下提交的哈希,然后运行'git reset hash_b4_temp_commit',这基本上就像通过将分支重置为“弹出”提交在它之前提交。 现在,你只剩下你不想藏匿的东西。
#15楼
这里的每个答案都是如此复杂......
这个“藏匿”怎么样:
git diff /dir/to/file/file_to_stash > /tmp/stash.patch
git checkout -- /dir/to/file/file_to_stash
这将弹出文件更改回来:
git apply /tmp/stash.patch
与存储一个文件并将其弹回的完全相同的行为。
#16楼
一个复杂的方法是首先提交一切:
git add -u
git commit // creates commit with sha-1 A
重置回原始提交但从新提交中检出the_one_file:
git reset --hard HEAD^
git checkout A path/to/the_one_file
现在你可以存储the_one_file:
git stash
通过在重置回原始提交时将已提交内容保存在文件系统中进行清理:
git reset --hard A
git reset --soft HEAD^
是的,有点尴尬......
#17楼
我发现没有答案是我需要的,这很简单:
git add -A
git reset HEAD fileThatYouWantToStash
git commit -m "committing all but one file"
git stash
这只存储了一个文件。
#18楼
我已经回顾了这个和许多类似线程的答案和评论。 请注意,以下命令均无法正确存储任何特定的已跟踪/未跟踪文件 :
git stash -p (--patch)
:手动选择帅哥,不包括未跟踪的文件git stash -k (--keep-index)
:存储所有被跟踪/未跟踪的文件并将它们保存在工作目录中git stash -u (--include-untracked)
:存储所有被跟踪/未跟踪的文件git stash -p (--patch) -u (--include-untracked)
:命令无效
目前,能够存储任何特定跟踪/未跟踪文件的最合理方法是:
- 暂时提交您不想存储的文件
- 添加并藏匿
- 弹出临时提交
我在回答另一个问题的过程中为这个过程编写了一个简单的脚本,这里有一些步骤可以在SourceTree中执行该过程 。
#19楼
解
地方变化:
- file_A(已修改)未上演
- file_B(已修改)未上演
- file_C(已修改)未上演
要仅使用file_C上的更改创建存储“my_stash”:
1. git add file_C
2. git stash save --keep-index temp_stash
3. git stash save my_stash
4. git stash pop stash@#{1}
完成。
说明
- 将file_C添加到暂存区域
- 创建一个名为“temp_stash”的临时存储,并将更改保存在file_C上
- 仅使用file_C上的更改创建想要的存储(“my_stash”)
- 将“temp_stash”(file_A和file_B)中的更改应用于本地代码并删除存储
您可以在步骤之间使用git status来查看正在进行的操作。
#20楼
我会使用git stash save --patch
。 我没有发现交互性令人讨厌,因为在它期间有选项将所需操作应用于整个文件。
#21楼
使用git stash push
,如下所示:
git stash push [--] [<pathspec>...]
例如:
git stash push -- my/file.sh
这是自2017年春季发布的Git 2.13开始提供的。
#22楼
git add . //stage all the files
git reset <pathToFileWillBeStashed> //unstage file which will be stashed
git stash //stash the file(s)
git reset . // unstage all staged files
git stash pop // unstash file(s)
#23楼
快速回答
要在git中还原特定的已更改文件,您可以执行以下操作:
git checkout <branch-name> -- <file-path>
这是一个实际的例子:
git checkout master -- battery_monitoring/msg_passing.py
#24楼
要存储单个文件,请使用git stash --patch [file]
。
这将提示: Stash this hunk [y,n,q,a,d,j,J,g,/,e,?]? ?
Stash this hunk [y,n,q,a,d,j,J,g,/,e,?]? ?
。 只需键入a
(将此块和所有后来的文件藏在文件中),你就可以了。
#25楼
如果您不想指定带有隐藏更改的消息,请在双击之后传递文件名。
$ git stash -- filename.ext
如果它是未跟踪/新文件,则必须先将其暂存。
此方法适用于git版本2.13+
#26楼
你可以这么简单:
git stash push "filename"
或者带有可选消息
git stash push -m "Some message" "filename"
#27楼
由于在Git中创建分支是微不足道的,因此您可以创建一个临时分支并将单个文件检入其中。
#28楼
VonC将文件复制到Git仓库之外的“中间”解决方案的问题在于,您丢失了路径信息,这使得稍后复制一堆文件会有些麻烦。
找到更容易使用tar(类似的工具可能会做)而不是复制:
- tar cvf /tmp/stash.tar path / to / some / file path / to / some / other / file(... etc.)
- git checkout path / to / some / file path / to / some / other / file
- git stash
- tar xvf /tmp/stash.tar
- 等(参见VonC的“中间”建议)
#29楼
更新以下答案是针对git 2.13之前的git。 对于git 2.13及更高版本,请查看我如何git存储特定文件?
警告
正如评论中所指出的,这会将所有内容都放入存储中,无论是分阶段还是非分阶段。 在保存完成后,--keep-index只保留索引。 以后弹出存储时,这可能会导致合并冲突。
这将隐藏您之前未添加的所有内容。 只需git add
你想要保留的东西,然后运行它。
git stash --keep-index
例如,如果要将旧提交拆分为多个更改集,可以使用以下过程:
git rebase -i <last good commit>
- 将某些更改标记为
edit
。 git reset HEAD^
git add <files you want to keep in this change>
git stash --keep-index
- 根据需要修复问题。 不要忘记
git add
任何更改。 git commit
git stash pop
- 必要时,从#5开始重复。
git rebase --continue
在git 2.13之前,只保存多个已更改的文件中的一个文件相关推荐
- 更改awr快照保存时间_如何更改OS X中屏幕快照的保存位置
更改awr快照保存时间 Screenshots are easy to take in OS X. You can either use Command+Shift+3 or Command+Shif ...
- C0302 将一个代码块中的内容保存在文件中, 查看一个rpm包是否可以安装
#!/bin/bash # 这个脚本是用来描述和确认是否可以安装一个rpm包 # 在一个文件中保存输出 SUCCESS=0 E_NOARGS=65 if [ -z "$1" ] t ...
- php将图片保存在数组中方法,php 把数组保存为标准的数组格式,存储到文件中...
$file='./test.php'; $array=array('color'=> array('blue','red','green'),'size'=> array('small', ...
- python怎么读取txt文件数据保存数组中-python将txt等文件中的数据读为numpy数组的方法...
实际中,很多数据都是存为txt文件.csv文件等,但是在程序中处理的时候numpy数组或列表是最方便的.本文简单介绍读入txt文件以及将之转化为numpy数组或列表的方法. 1 将txt文件读为lis ...
- Python提取PDF文件中的表格文本保存为Excel文件
"Python小屋"编程比赛正式开始 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020 ...
- python读取数据库数据、并保存为docx_Python从数据库读取大量数据批量写入文件的方法...
Python从数据库读取大量数据批量写入文件的方法 使用机器学习训练数据时,如果数据量较大可能我们不能够一次性将数据加载进内存,这时我们需要将数据进行预处理,分批次加载进内存. 下面是代码作用是将数据 ...
- 如何将Python对象保存在本地文件中?
Python对象的永久存储 1.使用Python的pickle模块 import pickle class A:def __init__(self,name,a):self.name=nameself ...
- R语言生成组合图并保存实战:实际上只保存了最后一个图问题、ggsave生成组合图并保存(保存完整组合图)
R语言生成组合图并保存实战:实际上只保存了最后一个图问题.ggsave生成组合图并保存(保存完整组合图) 目录
- python保存plot图片_Matplotlib savefig只保存图像,不保存行
我用figure.savefig(path)保存了一个matplotlib图形.这将保存我在画布上的图像,在图形中,但它不会保存我在图像上绘制的线条.在 以下是我如何创建我的身材:if new: y, ...
最新文章
- qt发布后 mysql数据库_qt发布后 mysql数据库
- ubuntu amd 64bit 安装 QQ for linux教程(附 不能使用中文的解决办法)
- GitHub 标星 5w+!Python 新手 100 天学习计划,这次再学不会算我输!
- 一步步把一个SpringBoot应用打包成Docker镜像并运行
- netflix测试能不能看_Netflix监管者测试–引入知事,准官员
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用
- ucache灾备云报价_UCACHE灾备云功能
- Study之2 Glance相关操作-devstack
- python接口编程_Python 中的面向接口编程
- python第一章笔记_head first python(第一章)–学习笔记
- python降维可视化 自编码_deep learning 自编码算法详细理解与代码实现(超详细)...
- jpa多表联查动态_Spring Data JPA 连表动态条件查询
- android 简单对话框实现
- NLP技术基石:从N-gram统计语言模型到BERT预训练模型演变史概述
- redis底层数据结构
- 人工智能可以替代人类?今天要来说说人工智能与人类意识到底差距在哪里!...
- xp打开html页面不正常显示不出来,xp打开网页图片加载不出来如何解决
- 【ubuntu使用排坑】fsckd-cancel-msg:Press Ctrl+C to cancel all filesystem checks
- Android 使用Ant编译Android 工程
- 【音视频】浅学ISP数据处理流程