GIT小知识积累

Picture

git push -u参数

git push -u参数大家应该都应该见过,但是对于初学者来说并不多见,github创建仓库初始就给出了git push -u origin master,但是后面却完全可以省略-u origin master。但是对于多个分支来说的仓库可就不是那么容易省略的了,需要多方面注意这个问题。

从git push给的-help来看:

1
2
3
4
git push -help
...
-u, --set-upstream set upstream for git pull/status
...

-u = --set-upstream : 为git pull/status设置流,啥意思?

git branch也有一个-u参数如下:

1
2
3
4
git branch -help
...
-u, --set-upstream-to <upstream> change the upstream info
...

-u = --set-upstream-to <upstream> : 改变流的信息。

上面都挺抽象的,下面具体介绍(以upsteam代替-u):

upstream是针对branch设置的参数项,而且和有几个远程库没有必然联系。

比如远程库repo1上有3个分支branch1、branch2、branch3。远程库repo2上有3个分支branchx、branchy、branchz。本地仓库有2个分支local1和local2。那么当初始状态时,local1和local2和任何一个分支都没有关联,也就是没有upstream。当通过git branch --set-upstream-to A/branch local1命令执行后,会给local1和branch1两个分支建立关联,也就是说local1的upstream指向的是branch1。这样的好处就是在local1分支上执行git push(git pull同理)操作时不用附加其它参数,Git就会自动将local1分支上的内容push到branch1上去。同样,local2分支也可以和远程库A和远程库B上的任何一个分支建立关联,只要给local2分支设置了upstream,就可以在local2分支上用git push(git pull同理)方便地与目标分支推拉数据。

综上所述,upstream是分支与分支之间的流通道,而且和有几个远程库没有必然联系。

对于git push -ugit branch --set-upstream-to指令之间的区别。

举个例子:要把本地分支master与远程仓库origin里的分支source建立关联,可以采用两种方法:

  1. git push方法

    1
    2
    git checkout master
    git push -u origin source
  2. git branch方法

    1
    git branch --set-upstream-to=origin/source

这两种方式都可以达到目的,但是1方法更通用,因为远程库有可能并没有source分支,这种情况下你用方法2是行不通的,但可以通过下面方法实施方法2:

1
2
git push origin source
git branch --set-upstream-to=origin/source master

git checkout/reset后,git log不再完整

阅读他人的代码时,经常会查看提交历史,而git checkout后,如果再想回到比较新的提交时就找不到对应的commit id了,这是一个麻烦点,这里可以采用git reflog来进行解决。

1
2
3
4
5
6
$ git reflog
64f21a9 HEAD@{0}: checkout: moving from 75bc2768595ef186651096a52ee66229fd5754f5 to master
75bc276 HEAD@{1}: checkout: moving from 64f21a9bd664ee29c09595c2e7c6d304a15be83f to 75bc2768595ef186651096a52ee66229fd5754f5
64f21a9 HEAD@{2}: checkout: moving from 75bc2768595ef186651096a52ee66229fd5754f5 to 64f21a9bd664ee29c09595c2e7c6d304a15be83f
75bc276 HEAD@{3}: checkout: moving from master to 75bc2768595ef186651096a52ee66229fd5754f5
64f21a9 HEAD@{4}: clone: from https://github.com/xxx/xxx.git

可以看到reflog记录了所有checkout的过程:

  1. HEAD@{4}:从github上下载下来
  2. HEAD@{3}:从master切换到: 75bc2768595ef186651096a52ee66229fd5754f5
  3. HEAD@{2}:从75bc2768595ef186651096a52ee66229fd5754f5切换到64f21a9bd664ee29c09595c2e7c6d304a15be83f
  4. HEAD@{1}:从64f21a9bd664ee29c09595c2e7c6d304a15be83f切换到75bc2768595ef186651096a52ee66229fd5754f5
  5. HEAD@{0}:从75bc2768595ef186651096a52ee66229fd5754f5切换到master

这样我们就可以切换到原来的位置,进而进入到想要的commit id处

Brick wechat
扫一扫,用手机看更方便(^ ◕ᴥ◕ ^)