Git远程仓库

1.git clone

此命令克隆远程仓库到当前目录。

  • 执行此命令后,本地仓库中每个分支都会分为两个,比如master会变成master 和origin/master,其中origin/master表示远程仓库的副本,它只跟踪远程仓库,理解这一点很重要!

2.git fetch

  • 这命令会将远程仓库同步到本地仓库的带origin标记的各个分支,但不会改变我们的工作区!
  • 比如仓库有master和bugFix分支,这个操作会更新origin/master和origin/bugFix,并不会改动master和bugFix。

3.git merge origin/master

此命令一般紧接着git fetch,将远程的更新合并到本地工作区。

4.git pull

此命令就是上两条命令的缩写,先fetch再merge。

  • 我们经常会先commit掉当前写的代码,然后pull下同事push的代码。
  • 不使用merge方式,采用rebase方式:

    1
    git pull --rebase

5.git push

此命令会将本地commit推送到远程仓库,并且会更新origin/分支。

  • 有时候远程仓库已经改变了,但是你的本地分支(没有origin/前缀)不会修改。

6.git push origin source:destination

  • 这里重点介绍三个参数origin:远程仓库的名字(一般都命名为origin),source:本地仓库的节点,destination:远程仓库的分支名。

  • source参数可以不写同时把冒号去掉,如:

    1
    git push origin master

意义是将本地仓库master分支推送到远程仓库origin的分支master,并且同步本地origin/master分支。

  • source参数可以带~和^等移动符,如:

    1
    git push origin master^:foo

此时将master上一个提交历史推送到origin仓库的foo分支。如果foo分支不存在,将直接创建foo分支。

7.git fetch origin source:destination

同理git fetch也有这种形式的命令,从这里可以看出fetch跟push其实是方向相反的操作,更深一步你可以用fetch代替push,只是大家都习惯使用fetch拉,push推。

  • 注意,destination参数如果不加origin/,就表示更新本地分支中的工作区,而不是跟踪远程仓库的

8.跟踪远程分支

git remote add origin <https/ssh>

有时候我们需要将一个项目提交到远程仓库,那么该怎么操作呢?

1
2
git remote add origin <https/ssh>
git push -u origin <branch>

Git高级操作

1.git cherry-pick A B C

git cherry-pick

假如我们有两条分支master和dev,现在我们要将dev分支上的feature D和feature E合并到master上要怎么办呢?

  • 方法一:首先切换到dev分支,查看各项commit-id,然后切换到master分支上,也是master的最新提交C处。之后使用git merge D,git merge E。
1
2
3
4
5
git checkout dev
git log
git checkout master
git merge D
git merge E
  • 方法二:首先也要查看dev上的commit-id,然后在C上使用git cherry-pick D E。
1
2
3
4
git checkout dev
git log
git checkout master
git cherry-pick D E
  • 好像两个方法优劣对比不是很强,但是cherry-pick后跟的commit-id可以有很多个,当需要抓取的feature较多时方法二的优势就出来了。

  • 注意,如果是 HEAD 上游的提交,那就不能用cherry-pick抓取过来,因为很明显不能将同一分支上的历史提交再次提交。

2.git rebase

  • 多人协作大家基本习惯了merge的方式进行提交代码。但是最大的弊端就是提交历史变得有许多平行线。实际的确也是并行开发,但是当要追踪修改历史的时候,嗯,你可以冲上一杯咖啡了哈哈哈。

  • 先更新master分支,在dev分支上使用命令

    git rebase master
    这样看起来就像是在master上的节点检出的分支又再次合并回主分支,这样整个提交树就非常线性,易于追踪。

  • 另一个操作是

    git rebase -i commit-id
    这个命令可以“可视化操作提交历史”,有丢弃,修改,排序等功能,可以使用上述的cherry-pick命令代替。本人觉得在命令行操作哪有什么可视化操作哈哈哈。

  • 需要注意的是如何在vi下编辑,按i进入编辑状态,按esc进入命令状态,在命令状态中输入:wq回车是保存并退出,:q!回车是不保存退出。更多的搜索vi命令吧。

3.git stash

这个命令挺有用,尤其是还没做完手头上的工作,又不得不做别的事(切换到别的分支治疗),并且不想因此commit,那么这系列命令对你很有用!

1
2
3
4
1.git stash 将当前未commit的修改压栈
2.git stash list 查看栈有哪些stash
3.git stash pop 弹出(恢复)栈顶修改
4.git stash clear 清空栈

Git版本回退

1.git diff XXX

  • 当我们使用git status查看工作区做了什么修改时,可以使用git diff XXX对修改过的文件XXX查看差异

2.git reset --hard HEAD^

版本库回退

  • 首先HEAD是指向当前版本的指针,我们提交的所有操作都建立在这个指针上。
  • HEAD是可以移动的,这条命令就是移动HEAD指针在历史版本中移动,HEAD^表示上一版本,HEAD^^和HEAD~2表示上两个版本,以此类推。
  • 由于有--hard这个参数,版本库相当于不知道有未来版本了,使用git log也没法查找到未来版本的commit-id。然后使用以下命令:

    1
    2
    3
    //用git reflog来找回之前commit的commit-id
    git reflog
    git reset --hard commit_id

即可找回原来的版本。

3.git revert HEAD

回退到上一版本的另一种方法,注意参数HEAD,是回退到上一版本。

  • git reset是不会产生新的提交记录,反而有可能抹去提交记录,当我们要推送到远程仓库时,显然没有提交记录怎么推送呢?所以git reset适合操作本地仓库,不需要分享给远程仓库的。
  • git revert是会在HEAD节点基础上生成一个提交节点的,也就是新的提交,所以可以推送到远程仓库,别人也能查看到远程记录。

4.git branch -f master HEAD^

在git branch命令后加上参数-f和分支名master以及节点名HEAD^,这样就把master分支强制指向了HEAD的上一版本。即使当前HEAD不在master分支上,使用这个命令也能强制移动master分支的最新提交节点。

5.清空提交记录(慎重)

有时候不小心把敏感信息上传到远程仓库怎么办?别怕按照以下步骤来,代价是以前的提交历史都没了。

  • 将敏感信息删除并生成一个commit。
  • 创建并切换到临时无提交分支temp:git checkout –orphan temp
  • 添加所有文件:git add -A
  • 提交更改:git commit -am “init”
  • 删除master分支:git branch -D master
  • 将temp分支重命名为master:git branch -m master
  • 强制推送到远程仓库:git push -f origin master