git进阶
工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的。
暂存区:已经 git add xxx 进去,且未 git commit xxx 的。
本地分支:已经git commit -m xxx 提交到本地分支的。
git cherry-pick
git cherry-pick <commitid>
将指定的提交(commitid)应用于当前位置(HEAD
)git cherry-pick <分支名>
将其他分支的最近一次提交,转移到当前分支转移到另一个代码库
Cherry pick 也支持转移另一个代码库的提交,方法是先将该库加为远程仓库。
$ git remote add target git://gitUrl
上面命令添加了一个远程仓库
target
。然后,将远程代码抓取到本地。$ git fetch target
上面命令将远程代码仓库抓取到本地。接着,检查一下要从远程仓库转移的提交,获取它的哈希值。
$ git log target/master
最后,使用
git cherry-pick
命令转移提交。$ git cherry-pick <commitHash>
创建新分支
git checkout -b <your-branch-name>
创建一个新的分支同时切换到新分支
- git branch <branch-name>
- git checkout <branch-name>
合并分支
- git merge
- git rebase,Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。例如:当前在dev1,
git rebase dev2
,将dev2的一系列提交记录合到dev1上,dev2有多少个commit记录,就会合多少次
Head
- head 指向提交记录(commit 的哈希字串),也可以指向分支
- 分支永远指向 分支上的最新提交
提交记录
- git checkout <branch-name>^,使用
^
向上移动 1 个提交记录
- git checkout <branch-name>~2,使用
~<num>
向上移动多个提交记录,如~3
- git checkout HEAD^,当前所在分支或记录的上一个提交记录
git branch -f 分支名 commitid~3
git branch -f 分支名 commitID;
作用是将其他分支上的本地代码硬重置到某个commitId下,不能重置本分支,如:
git branch -f master devID1
那么master上的代码就会和dev一样,并且历史记录也会一样,只是dev分支上的代码可能会比master上的新一点,因为是重置的commitId
撤销变更
- git reset commitid 通过把分支记录回退几个提交记录来实现撤销改动。只是本地代码,不是远端代码;仅改变暂存区,并不改变工作区【慎用,会导致中间的提交记录丢失】
是将之前的提交记录全部抹去,将 HEAD 指向自己重置的提交记录,对应的提交记录都不复存在
$ git reset HEAD^ # 回退所有内容到上一个版本
$ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
$ git reset 052e # 回退到指定版本
- git revert <commit_id> 引入一个新的commit,这个新的commit代码内容 和需要回退到的commitid相同,revert 之后就可以把你的更改推送到远程仓库。
操作是将选择的某一次提交记录 重做,若之后又有提交,提交记录还存在,只是将指定提交的代码给清除掉
- git diff
git diff:是查看 工作区(未git add) 与 暂存区(已git add,未commit) 的差别的。
git diff --cached:是查看 暂存区 (已git add,未commit) 与 本地仓库(已commit) 的差别的。
git status 查看工作区相较于暂存区修改的文件
- git checkout . 撤销工作区的修改
- git stash 保存暂存区和工作区的修改,
git stash save 'message...'
可以添加注释,使用git stash pop
恢复修改
git stash | 隐藏当前的工作现场, 此时, git status的结果是 clean |
git stash list | 查看所有隐藏, 每一行的冒号前面的字符串就是标识此隐藏的id |
git stash apply | 重新显示标识为 id 的隐藏 |
git stash drop | git apply恢复隐藏后, 需要手动删除 list 列表中的记录 |
git stash pop | 恢复最新的进度到工作区 |
git stash pop stash@[stash_id] | 恢复指定的进度到工作区 |