重写提交说明:
修改最新的提交:git commit --amend
修改历史的提交:git rebase -i commit_id
删除误提交的文件:
1:git rm --cached filename
2:
修改最新的提交:git commit --amend
修改历史的提交:git rebase -i commit_id
在 git命令行开启颜色显示:
git config --global color.ui true
在工作区搜索文件内容:
git grep "search content"
查看提交历史详情:
git log --stat
查看本地操作日志:
git reflog : 查看所有的日志
git reflog show branch 查看指定分支的操作日志
diff:
git diff : 工作区与暂缓区相比的差异
git diff HEAD : 工作区与当前分支相比的差异
git diff --cached :当前分支与暂缓区的区别
git add:
暂存区的目录树会被更新
git add -u : 可以将被版本库追踪的本地文件的变更(修改、删除)全部记录到暂存区
git add -i : 进入交互式页面
git commit:
暂存区的目录树会写到版本库中,master最新指向的目录树就是提交时原暂存区的目录树。
git commit -a :不推荐使用。会直接对本地所有变更的文件指向提交操作,包括修改和删除的文件,但不包括未被版本库跟踪的文件。
git rm --cached <file>:
直接从暂存区删除文件,工作区则不作出改变。
git reset 详解:
1: git reset [-q] [<commit>] <paths>
包含了路径<paths>的用法不会重置引用,更不会改变工作区,而是用指定提交状态<commit>下的文件<paths>替换暂缓区的文件。例如git reset HEAD <paths> 会将最近一次提交下的<paths>在暂缓区去掉。
2 : git reset [--soft | --mixed|--hard|--merge|--keep] [-q] [<commit>]
根据不同的选项对工作区和暂缓区进行重置。
A : 使用参数--hard 如:git reset --hard commitId
1:替换引用的X。引用指向新的提交ID
2:替换暂存区,替换后,暂存区的内容与引用指向的目录树一致
3:替换工作区,替换后,工作区变得和暂缓区一致。
B:使用参数--soft 如:git reset --soft commit
执行上面的1步骤。即只改变引用的指向,不改变暂存区和工作区
C:使用参数--mixed 或不使用参数(默认是mixed) 如:git reset commitid
执行上面的1、2步骤。即更改引用的指向及重置暂缓区,但是不改变工作区。
eg:
git reset HEAD: 暂存区的目录会被重写,会被master分支指向的目录树所替换,但是工作区不受影响
git checkout 详解:
1:git checkout [-q] [<commit>] [--] <paths>
<commit>是可选项,如果省略则相当于从暂存区(index)进行检出。主要用于覆盖工作区,如果commit不省略也会替换暂存区和工作区相应的文件。不会改变HEAD头指针。
2:git checkout branch
主要用于切换分支。会改变HEAD头指针。只有HEAD切换到一个分支才可以对提交进行追踪,否则仍然进入"分离头指针"状态。
3:git checkout [-m] [[-b]--orphan <new-branch>] [start-point]
主要用于创建和切换到新的分支
eg:
git checkout branch filename :维持HEAD的指向不变,用branch指向的提交中的filename替换暂存区和工作区中相应的文件
git checkout . 或 git checkout -- file :会将暂存区全部的文件或指定的文件替换工作区的文件。
git checkout HEAD . 或git checkouy HEAD <file>:会用HEAD指向的master分支中全部或部分文件替换暂存区和工作区的文件。
git rebase 详解 :
1:git rebase --onto <newbase> <since> <still>
a:首先会执行git checkout切换到<till>。因为会切换到till,因此如果till指定的不是一个分支,则变基操作是在detached HEAD中进行的,当变基结束后,对master分支执行重置以实现变基结果在分支中生效
b:将since 到till所标示的提交范围写的一个临时文件中。不包括since但包括till
c:将当前分支强制重置(git reset --hard )到 <newbase>
d:从保存的临时文件中的提交列表中,将提交逐一按顺序重新提交到重置之后的分支上。
e:如果在提交过程中遇到冲突,则变基过程暂停。用户解决冲突后,执行git rebase --continue继续变基操作。或者执行git rebase --skip跳过此提交。执行git rebase --abort就此终止变基操作。
删掉某条历史提交
例如:有 c、d、e、f几个提交,现在想删除d提交
方法1:
git checkout c : 此时分支会出现分离状态
git cherry-pick e f :将ef两个提交cherry过来
git checkout master : 使分离的分支重新跟踪
git reset --hard HEAD@{1} ; 将reset到刚才cherry过的commintid上。也可以使用 git reset --hard commitID(刚才cherry-pick的id)
方法2:
git rebase --onto c d f
git checkout master : 使分离的分支重新跟踪
git reset --hard HEAD@{1} ; 将reset到刚才rebase过的commintid上。也可以使用 git reset --hard commitID(刚才rebase的id)
例如:有提交 c、d、e、f几个提交,现在想删除合并c、d提交到一起
方法1:
git checkout d
git reset --soft c
git commit -c c
git cherry-pick e f :将ef两个提交cherry过来
git checkout master : 使分离的分支重新跟踪
git reset --hard HEAD@{1} ; 将reset到刚才cherry过的commintid上。也可以使用 git reset --hard commitID(刚才cherry-pick的id)
方法2:
git checout d
git reset --soft c
git commit -c c
git tag tagName 通过tag记住这个提交ID,git rev-parse tagName.查看commitid
git rebase --onto tagName d f
git checkout master : 使分离的分支重新跟踪
git reset --hard HEAD@{1} ; 将reset到刚才tag过的commintid上。也可以使用 git reset --hard commitID(刚才tag的id)
git tag -d tagName 删除刚才备份的tag