Skip to content

Git(二)

sqmax edited this page Jun 26, 2018 · 6 revisions

上篇文章对课程中用到的Git命令做了探究。感觉Git很复杂,加之最近工作中遇到的上面提到的问题,下面我又对一些自己工作或学习中常用的命令做一下归纳。

git fetch获取远程代码到本地仓库

对于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 origin master

可简写为git pull,相当与下面两条命令的合并:

git fetch origin master
git merge origin/master

git删除远程分支

git push origin :<branch>

git stash

综合下网上的介绍和资料,git stash(git储藏)可用于以下情形:

  • 发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑git stash。
  • 使用git的时候,我们往往使用分支(branch)解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修Bug,等到修完Bug,提交到服务器上后,再使用git stash apply将以前一半的工作应用回来。
  • 经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。储藏(stash)可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

缓存(stash)修改

git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工作目录就干净了。 需要说明一点,stash是本地的,不会通过git push命令上传到git server上。 实际应用中推荐给每个stash加一个message,用于记录版本,使用git stash save <message>取代git stash命令。

重新应用缓存(stash)

可以通过git stash pop命令恢复之前缓存的工作目录。这个指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下。你也可以使用git stash apply命令,将缓存堆栈中的stash多次应用到工作目录中,但并不删除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)

从stash创建分支

你可以运行 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一个版本库,来对个命令进行实践。

Clone this wiki locally