-
Notifications
You must be signed in to change notification settings - Fork 626
Git(二)
上篇文章对课程中用到的Git命令做了探究。感觉Git很复杂,加之最近工作中遇到的上面提到的问题,下面我又对一些自己工作或学习中常用的命令做一下归纳。
对于git pull命令还算熟悉,就是从远程分支获取并与本地关联的分支合并。对这个命令网上的解释让我疑惑,从远程获得的代码放在哪里,那个分支。有的说放到本地的origin master分支,然而本地并没有origin ma 下面使一些尝试的探究:
理解 fetch 的关键, 是理解 FETCH_HEAD,FETCH_HEAD指的是: 某个branch在服务器上的最新状态。这个列表保存在 .git/FETCH_HEAD 文件中, 其中每一行对应于远程服务器的一个分支。比如我的服务器上有三个分支,.git/FETCH_HEAD的内容如下:
1dda9244c52e802e052e5cdfc22e8fbe7ff97267 branch 'master' of https://github.com/sqmax/springboot-project
018add0733082635115dc48e09416b80324a0f4f not-for-merge branch 'blog' of https://github.com/sqmax/springboot-project
ad87d1ce6a496ea0f59f6b994b8b00b1c92ea2c8 not-for-merge branch 'gh-pages' of https://github.com/sqmax/springboot-project
当前分支指向的FETCH_HEAD,就是这个文件第一行对应的那个分支。一般来说, 存在两种情况:
- 如果没有显式的指定远程分支,则远程分支的master将作为默认的FETCH_HEAD。
- 如果指定了远程分支,就将这个远程分支作为FETCH_HEAD。如下:
git fetch origin branch1
通常的用法:
//方法一
$ git fetch origin master //从远程的origin仓库的master分支下载代码到本地的origin/master
$ git merge origin/master //把远程下载下来的代码合并到本地仓库
//方法二
$ git fetch origin master:temp //从远程的origin仓库的master分支下载到本地并新建一个分支temp
$ git diff temp//比较master分支和temp分支的不同
$ git merge temp//合并temp分支到master分支
$ git branch -d temp//删除temp
看上面第一行的注释:从远程的origin仓库的master分支下载代码到本地的origin master
,我看别的博客时有提到,对这个本地的origin master分支感到很疑惑,什么是本地的origin master,我用git branch
命令查看时本地并没有什么origin master分支呀。所以我在文章开头着重介绍了FETCH_HEAD,我想是和它有关吧。
上面git fetch origin master:temp
,首先执行fetch操作,使用远程master分支在本地创建temp(但不会切换到该分支),如果本地不存在temp分支, 则会自动创建一个新的temp分支,如果本地存在temp分支, 并且是fast forward
, 则自动合并两个分支, 否则, 会阻止以上操作。
参考:https://www.cnblogs.com/chenlogin/p/6592228.html
可简写为git pull
,相当与下面两条命令的合并:
git fetch origin master
git merge origin/master
git push origin :<branch>
综合下网上的介绍和资料,git stash(git储藏)可用于以下情形:
- 发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑git stash。
- 使用git的时候,我们往往使用分支(branch)解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修Bug,等到修完Bug,提交到服务器上后,再使用git stash apply将以前一半的工作应用回来。
- 经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。储藏(stash)可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。
git stash
会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工作目录就干净了。
需要说明一点,stash是本地的,不会通过git push命令上传到git server上。
实际应用中推荐给每个stash加一个message,用于记录版本,使用git stash save <message>
取代git stash
命令。
可以通过git stash pop
命令恢复之前缓存的工作目录。这个指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下。你也可以使用git stash apply
命令,将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝。
可以使用git stash list
命令可以查看缓存栈里的所有缓存。如下:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
在使用git stash apply
命令时可以通过名字指定使用哪个stash,默认使用最近的stash(即stash@{0}
)。
4. 移除缓存
可以使用git stash drop
命令,后面可以跟着stash名字。下面是一个示例:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
你可以运行 git stash branch <branchname>
,这会从在缓存的基础上创建一个新的分支。
默认情况下,git stash会缓存下列文件:
- 添加到暂存区的修改(staged changes)
- Git跟踪的但并未添加到暂存区的修改(unstaged changes)
但不会缓存一下文件:
- 在工作目录中新的文件(untracked files)
- 被忽略的文件(ignored files)
git stash命令提供了参数用于缓存上面两种类型的文件。使用-u或者--include-untracked可以stash untracked文件。使用-a或者--all命令可以stash当前目录下的所有修改。
参考:https://www.cnblogs.com/tocy/p/git-stash-reference.html
Git的命令很复杂,还是建议自己git init
一个版本库,来对个命令进行实践。
目录