对于 git 操作,每次修改都是有所记录,比如删除并不是真的删除了,所有的操作都记录在磁盘上,git 的本质就是以空间换方便。
有如下提交历史:
在提交过程中,有时候发现某次的提交记录不恰当,需要修改,可以使用如下操作:
# git rebase -i 434b071f
Stopped at f0f7a14... modfy a.c
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
然后依次执行命令:
# git commit --amend 在此修改记录
# git rebase --continue
对于一个大型项目,开发周期的增加,导致提交的次数也增加,有可能一个功能会需要提交好几次,对于参与开发的人来说增加了负担,故此需要定时删除一些 commit 记录。但是,drop很多时候会出现错误,此错误无法解决,不建议使用。如下提交记录:
合并提交记录的操作有两个,都是合并到前一个commit中,具体的区别如下:
Git 提供了一个 stash 功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作(前提是文件已经被跟踪):
$ git stash #保存工作区
Saved working directory and index state WIP on dev: 6224937 add
merge
HEAD is now at 6224937 add merge
$ git stash list #查看已经保存的工作区
stash@{0}: WIP on dev: 6224937 add merge
工作现场还在,但是需要恢复一下,有两个办法:
$ git stash apply #恢复后,stash内容并不删除
$ git stash drop #删除stash内容
$ git stash pop #恢复的同时把stash内容也删了
多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}
对于文件夹的忽略比较特殊:
# 注释行
# 忽略dbg文件和dbg目录
dbg
# 只忽略dbg目录,不忽略dbg文件
dbg/
# 只忽略dbg文件,不忽略dbg目录
dbg
!dbg/
# 只忽略当前目录下的dbg文件和目录,子目录的dbg不在忽略范围内
/dbg
?
:代表任意的一个字符;*
:代表任意数目的字符;{!ab}
:必须不是此类型;{ab,bb,cx}
:代表ab,bb,cx中任一类型即可;[abc]
:代表a,b,c中任一字符即可;[^abc]
:代表必须不是a,b,c中任一字符。
某些文件如果已经被纳入了版本管理中,后期在 .gitignore
中已经声明了忽略路径也不起作用,这时候我们就应该先把本地缓存删除,然后再进行 git push
操作,这样就不会出现忽略的文件了。
git清除本地缓存命令如下(例如删除 .idea
文件夹的版本控制):
# 先将 .idea 的文件路径加入 .gitignore
git add .gitignore
git rm -r --cached .idea
git add .
git commit -m 'update .gitignore'
这样就将 .idea
从版本控制中删除了。
指定非文本文件的对比合并方式。
config 配置有system级别 global(用户级别) 和local(当前仓库)三个 设置先从system-》global-》local 底层配置会覆盖顶层配置 分别使用–system/global/local 可以定位到配置文件:
查看系统config:git config --system --list
;
查看当前用户(global)配置:git config --global- --list
;
查看当前仓库配置信息:git config --local --list
。
使用git add添加要提交的文件的时候,如果文件名是中文,会显示形如897\232\350\256…的乱码,解决办法:git config --global core.quotepath false
。
原因:core.quotepath设为false的话,就不会对0x80以上的字符进行quote。中文显示正常。
使用命令:git config -l
。
关于子模块的介绍在第四篇中。
因篇幅问题不能全部显示,请点此查看更多更全内容