rebase变基/衍合
作业:实现如下操作
git rebase -i HEAD~4 复制代码
再来一题:
// 首先将master移动到C4分支 $ git branch -f master C4 // 由bugFix切换到master上 $ git checkout master //复制 $ git rebase -i HEAD~3 复制代码
二思后新的解题思路:
git rebase bugFix master git rebase -i HEAD~3 复制代码
again:(不允许使用 cherry-pick)
//首先将master移动到C3上 $ git branch -f master C3 //检出master $ git checkout master $ git rebase -i HEAD~2 $ git rebase -i HEAD~1 $ git rebase -i HEAD~2 复制代码
另一种解题思路:
$ git rebase -i HEAD~2 $ git rebase -i HEAD~1 $ git rebase -i HEAD~2 $ git rebase caption master 复制代码
此外着重需要注意下述命令:
git rebase o/master side1 相当于 git checkout side1 git rebase o/master 复制代码
假设 HEAD 在 foo 分支节点上(foo*标识),如果想要将 master 移动到 foo 所在的节点上,并且检出,则可以通过一条命令来实现。
git rebase foo master 复制代码
tag
分支很容易被人为移动,并且当有新的提交时,它也会移动。分支很容易被改变,大部分分支还只是临时的,并且还一直在变。Tag 可以永远指向某个提交记录的标识呢,比如软件发布新的大版本,或者是修正一些重要的 Bug 或是增加了某些新特性。
它们并不会随着新的提交而移动。你也不能检出到某个标签上面进行修改提交,它就像是提交树上的一个锚点,标识了某个特定的位置。
$ git checkout master $ git cherry-pick C2 $ git branch -f master C1 $ git cherry-pick C2 C3 复制代码
Describe
由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来描述离你最近的锚点(也就是标签),它就是 git describe
!
Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 git bisect
(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。
clone
git clone 复制代码
git clone
命令在真实的环境下的作用是在本地创建一个远程仓库的拷贝(比如从 github.com)。
如果你看到一个名为 o/master
的分支,那么这个分支就叫 master
,远程仓库的名称就是 o
。
大多数的开发人员会将它们主要的远程仓库命名为 origin
,并不是 o
。这是因为当你用 git clone
某个仓库时,Git 已经帮你把远程仓库的名称设置为 origin
了
不过 origin
对于我们的 UI 来说太长了,因此不得不使用简写 o
:) 但是要记住, 当你使用真正的 Git 时, 你的远程仓库默认为 origin
!
思路:在 master
分支上做一次提交;然后检出 o/master
,再做一提交。这有助于你理解远程分支的不同,他们的更新只是反映了远程的状态。
$ git commit $ git checkout o/master $ git commit 复制代码
克隆一个远程仓库(用 git clone
),再在刚创建的远程仓库中模拟一些修改,然后在你自己的本地分支上做一些提交,再拉取远程仓库的变更。
git clone //假设成员做两次修改 git fakeTeamwork 2 //本地提交,生成 C4 git commit //更新 git pull 复制代码
log
git log 复制代码
查看之前提交的 git 历史。
merge与rebase区别
优点:
- Rebase 使你的提交树变得很干净, 所有的提交都在一条线上
缺点:
- Rebase 修改了提交树的历史
比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的,但实际上是在 C3 之前。
推荐阅读:git rebase 使用详解
组合拳
que1:
思路提示:
- 这里共有三个特性分支 ——
side1
side2
和side3
- 我需要将这三分支按顺序推送到远程仓库
- 因为远程仓库已经被更新过了,所以我们还要把那些工作合并过来
$ git fetch $ git rebase o/master side1 $ git rebase side1 side2 $ git rebase side2 side3 $ git rebase side3 master $ git push 复制代码
que2:
标准答案:
$ git checkout master // git pull 相当于 git fetch + git merge $ git pull $ git merge side1 $ git merge side2 $ git merge side3 $ git push 复制代码
que3:
当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程分支(比如 o/master
)。然后再创建一个跟踪远程仓库中活动分支的本地分支,默认情况下这个本地分支会被命名为 master
。
- pull 操作时, 提交记录会被先下载到 o/master 上,之后再合并到本地的 master 分支。隐含的合并目标由这个关联确定的。
- push 操作时, 我们把工作从
master
推到远程仓库中的master
分支(同时会更新远程分支o/master
) 。这个推送的目的地也是由这种关联确定的!
拉取远程分支并创建本地分支
git checkout -b foo o/master 复制代码
使用该方式会在本地新建分支 foo,并自动切换到该本地分支 foo。采用此种方法建立的本地分支会和远程分支 o/master 建立映射关系。
另一种设置远程追踪分支的方法就是使用:git branch -u
命令,执行:
git branch -u o/master foo 复制代码
这样 foo
就会跟踪 o/master
了。如果当前就在 foo 分支上, 还可以省略 foo:
git branch -u o/master 复制代码
查看如下案例:
作业:
$ git checkout -b side o/master $ git commit $ git pull --rebase $ git push 复制代码
查看远程仓库地址
到达指定项目目录下,该目录下包含.git 文件夹。然后打开 git,输入以下命令:
git remote -v 复制代码
查看/修改用户名和邮箱地址
查看用户名和邮箱地址:
$ git config user.name $ git config user.email 复制代码
修改用户名和邮箱地址:
$ git config --global user.name "username" $ git config --global user.email "email"