文章目录
本地提交
提交到本地仓库
$ git commit // 在当前分支上提交到本地
$ git branch newBranch // 新建一个分支。
$ git checkout newBranch // 移动到某个分支
$ git checkout -b <your-branch-name> // 也可以简化为一个指令
$ git merge a // 首先这个指令的前提是你在master分支上,然后命令会实现,将a合并到master分支上。并且前进一个。
//Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
$ git rebase master // 假设自己是local节点,会将自己复制到master节点并且成为它的子节点。
$ git rebase master local // 将local节点合并到master节点后面
$ git cherry-pick C4 C3 // 这里可以实现类似rebase'的操作。复制这些节点到自己的下方。 !!!区分和rebase的区别,谁当谁的儿子!!
在提交树上移动
对于git指令来说,是存在一个虚拟的HEAD
指向标记的。这个标记表示了当前的最新位置。而master
表示了当前的分支的位置。
我们可以移动HEAD
和master
的位置。核心是checkout
。并且需要注意,如果我们使用git checkout X
这样会使得HEAD先进行移动,也就是与master分支进行分离。当然我们也可以进行相对位置的移动, 利用^
移动到父节点,或者~<num>
向上多个节点。
除了移动HEAD之外,我们还可以移动分支,这就是需要强制命令--force
。并且需要配合branch
。
$ git checkout C1 // 这里的C1表示了哈希值,是一个绝对地址。这种方法只是移动头节点。
$ git checkout master^ // Head移动到master的父节点的位置。
$ git checkout master~2 // Head移动到master的父父节点。
$ git branch -f master HEAD~3 // master分支移动到HEAD的父3节点。
$ git rebase -i HEAD~4 // 可以交互式看到之前的4个节点并且操作合并这个四个节点按照任意的顺序合并到前5个父节点
撤销提交
在本地撤销就是reset
,相当于回退一步。在云端撤回就是就是revert
$ git reset master~1 // git的节点撤回了一步 注意这里没有用checkout因此HEAD和当前分支
不发生分离。这两个是一体。
$ git revert master//
选择性提交和修改
主要是使用命令git rebase -i HEAD~3
这种形式的命令实现修改有选择的整合。这个可以是在新的一枝中选择需要的node进行合并,并且更新master到最新。也可以是修改之前的某一次提交。我们以修改之前的某一次提交为例子。
git rebase -i HEAD~2;// 这里需要配合的切换C2和C3的顺序。
// 修改之后,c2就位于最新的位置了。此时我们可以修改内容。
git commit --amend; // 这里可以修改相关的c2文件
// 修改完成以后重新正过来位置
git rebase -i HEAD~2;
// 最后更新master节点到最新的位置
git checkout master; git rebase caption;
需要注意这种方法可能导致rebase 的冲突,似乎另外一种方法更好,采用cherry-pick
的方法,可以复制并合并在HEAD节点之后的任意节点。同样的任务我们可以改写为
// 首先复制newImage进行合并,然后修改,然后合并caption。相当于重新操作了一整遍。
git cherry-pick newImage;
git commit --amend;
git cherry-pick caption;
添加标签
git 当中树枝是会发生移动的,但是我们希望有一个可以标识节点的东西。这个就是tag标签。我们可以给一些节点添加标签标识这是2.0版本等等。
git tag V2 c2 // 标识c2这个点加上了V2这个tag
git describe master // 找到master这个点的最近的tag 比如这个返回v1_2_gC6 标识master这个树上,最近的标签是v1,距离是2,master的哈希标识为C6
远程提交
本地创建一个仓库
git clone [url] // 远程仓库会在我的本地创建一个本地副本`origin/master`这个指示了远程仓库的最新位置
git fetch // 从远程仓库更新本地仓库,但是这个只是已经将进行这一操作所需的所有数据都下载了下来,但是并没有修改你本地的文件
git pull // 这个指令包含了git fetch 和git merge
git pull --rebase 与 git pull的区别
为什么更喜欢使用rebase呢?因为rebase可以让你的提交树更加的干净整洁。但是merge也有优点,可以让你的历实记录得到保留。
// 同样的命令
git pull; git push; // 图1
git pull --rebase; git push; // 图2
追踪
使用git branch -u o/master foo
,可以实现 foo 就会跟踪 o/master 了。这样在push以后foo分支的内容会push到远端的master上。
fetch,push, pull进阶
git push origin master // 切到本地仓库中的“master”分支,获取所有的提交,再到远程仓库“origin”中找到“master”分支,将远程仓库中没有的提交记录都添加上去
git push origin <source>:<destination> // 比如git push origin master:foo 把本地的master提交到远程的foo分支..<source>远端内容 <detunation>本地目标
git push origin :<destination> // 会输出云端destination 的部分内容。
对于fetch同理,如果没有任何参数,那么会下载全部分支
但是如果给定参数只会下载某个分支
git fetch origin foo;// 下载远程最新的内容到本地的origi/foo的下,而不是我的foo下
git fetch origin <source>:<destination>
git fetch origin foo:bar // 下载远程foo分支的内容到bar下 <source>远端内容 <detunation>本地目标
对于pull也是类似的命令
git pull origin <soure>:<destination> // 将远端的<source>分支下载到本地的<destination>分支,并且与当前checkout的分支合并
全命令关键词总结
-
git add . 虽然没有提及,但是这也是个基本命令,commit的前一步
-
git status 查看git的监控状态
-
git commit
-
git checkout
-
git rebase // git rebase -i HEAD~3
-
git cherry-pick
-
git meger // 合并到当前分支下方
-
git branch
-
git branch -f // 强制移动到name节点
-
~ and ^ and ^2 切换不同的父节点
-
git reset master~1 // 本地撤销
-
git revert master
-
git tag
-
git describe // 找到master节点最近的标签
-
git clone [url]
-
git fetch
-
git pull AND git pull --rebase
-
git push
-
git fetch/pull/push origin : // 特殊的处理