[关闭]
@TryLoveCatch 2024-03-23T02:21:28.000000Z 字数 4837 阅读 1013

Android基础之git

android android基础 git


tag

git tag命令

列显已有的标签

  1. $ git tag
  2. v1.0
  3. v1.2
  4. ...
  5. ...

如果一个仓库有非常多的tag,这样看起来很不方便,可以使用模糊匹配。
例如,我们想看1.2.x的所有版本,那么

  1. $ git tag -l 'v1.2.*'
  2. v1.2.1
  3. v1.2.2
  4. v1.2.3
  5. v1.2.4

创建标签

  1. $ git tag -a v1.4 -m 'my version 1.4'
  2. $ git tag
  3. v1.0
  4. v1.2
  5. v1.4
  6. ...
  7. ...

可以不加-m,这个时候,就会进入编辑页面,输入说明

查看标签

git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。

  1. $ git show v1.4
  2. tag v1.4
  3. Tagger: Scott Chacon <schacon@gee-mail.com>
  4. Date: Mon Feb 9 14:45:11 2009 -0800
  5. my version 1.4
  6. commit 15027957951b64cf874c3557a0f3547bd83b3ff6
  7. Merge: 4a447f7... a6b4c97...
  8. Author: Scott Chacon <schacon@gee-mail.com>
  9. Date: Sun Feb 8 19:02:46 2009 -0800
  10. Merge branch 'experiment'

删除标签

  1. $ git tag -d v1.0

推送标签

git push origin [tagname]

  1. $ git push origin v1.5
  2. Counting objects: 50, done.
  3. Compressing objects: 100% (38/38), done.
  4. Writing objects: 100% (44/44), 4.56 KiB, done.
  5. Total 44 (delta 18), reused 8 (delta 1)
  6. To git@github.com:schacon/simplegit.git
  7. * [new tag] v1.5 -> v1.5

一次性推送所有本地标签:

  1. $ git push origin --tags
  2. Counting objects: 50, done.
  3. Compressing objects: 100% (38/38), done.
  4. Writing objects: 100% (44/44), 4.56 KiB, done.
  5. Total 44 (delta 18), reused 8 (delta 1)
  6. To git@github.com:schacon/simplegit.git
  7. * [new tag] v0.1 -> v0.1
  8. * [new tag] v1.2 -> v1.2
  9. * [new tag] v1.4 -> v1.4
  10. * [new tag] v1.4-lw -> v1.4-lw
  11. * [new tag] v1.5 -> v1.5

拾遗

壹 tag以及branch的区别

参考:Git Tag以及Branch的区别

什么时候打Tag

当一个release版本发布时

相同点

区别

贰 merge和rebase区别

Git 之 merge 与 rebase 的区别
图解4种git合并分支方法

merge

  1. master
  2. |
  3. 1--2--3--4--5
  4. |
  5. --6--7
  6. |
  7. feature

执行下面的命令,feature的节点会变成合成的节点

  1. git checkout feature
  2. git merge master

执行下面的命令,master的节点会变成合成的节点

  1. git checkout master
  2. git merge feature
fast-forward

如果待合并的分支在当前分支的下游,也就是说没有分叉时,会发生快速合并,从test分支切换到master分支,然后合并test分支

  1. git checkout master
  2. git merge test

这种方法相当于直接把master分支移动到test分支所在的地方,并移动HEAD指针

no-ff

如果我们不想要快速合并,那么我们可以强制指定为非快速合并,只需加上--no-ff(no fast forward)参数

  1. git checkout master
  2. git merge no-ff test

这种合并方法会在master分支上新建一个提交节点,从而完成合并

squash

svn的在合并分支时采用的就是这种方式,squash会在当前分支新建一个提交节点
squash和no-ff非常类似,区别只有一点不会保留对合入分支的引用

  1. git checkout master
  2. git merge squash test

rebase

危险操作

还是上面的例子

  1. master,origin/master
  2. |
  3. 1--2--3--4--5
  4. |
  5. --6--7
  6. |
  7. feature,origin/feature

我们假设master和feature都已经push到远程分支了,这个时候,我们执行下面的操作:

  1. git checkout feature
  2. git rebase master

我们的本地仓库就变成了这样:

  1. master,origin/master
  2. |
  3. 1--2--3--4--5--6`--7`
  4. | |
  5. --6--7 feature
  6. |
  7. origin/feature

然后我们push一下(这里可能会push不成功):

  1. git push origin feature

那么远程仓库也就跟着改变了:

  1. master,origin/master
  2. |
  3. 1--2--3--4--5--6`--7`
  4. |
  5. feature,origin/feature

之前的提交6和7已经没有了。

那么 假设另一个同事A也在基于feature开发,他的本地仓库是这样的:

  1. master,origin/master
  2. |
  3. 1--2--3--4--5 feature
  4. | |
  5. --6--7--8--9--10
  6. |
  7. origin/feature

然后 A执行要同步远程代码:

  1. git fetch

那么这个时候,A的本地仓库是:

  1. master,origin/master
  2. |
  3. 1--2--3--4--5--6`--7`
  4. | |
  5. | origin/feature
  6. |
  7. | feature
  8. | |
  9. --6--7--8--9--10

那么这个时候,A同步feature的代码:

  1. git rebase origin/feature

只有 你的分支上 需要 rebase 的所有 commits 都没有被 push 过,就可以安全地使用 git-rebase来操作。
上面的例子中,feature的6和7 commit都已经push过了,所以不要使用rebase命令。

叁 patch 和 diff

Git 打补丁-- patch 和 diff 的使用(详细)

Git 提供了两种补丁方案,git path和git diff

区别

patch

创建
最近几次提交
  1. // 最近的1次commit的patch
  2. git format-patch HEAD^
  3. // 最近的2次commit的patch
  4. git format-patch HEAD^^
  5. // 也是最后1次commit
  6. // -1表示最后一次提交
  7. // -o表示补丁文件输出的目录。
  8. git format-patch -1 -o /root/patch/
  9. // -5表示将最近5次提交制作成补丁
  10. git format-patch -5 -o /root/patch/
从某commit以来的修改
  1. // 将某次提交(不包含该次提交)之前的所有提交做成补丁
  2. git format-patch de85add54522b7ca3b7ad99c7c5ea24525d39ba0 -o /root/patch/
  3. // 只将该次提交制作称补丁
  4. git format-patch -1 de85add54522b7ca3b7ad99c7c5ea24525d39ba0 -o /root/patch/
  5. // 该次提交之前的3个提交(含本次提交)制作成补丁
  6. git format-patch -3 de85add54522b7ca3b7ad99c7c5ea24525d39ba0 -o /root/patch/
两个commit间的修改
  1. // 将两次提交之间的内容(包含两个commit)全部做成补丁,注意的是两次commit id之前是三个点(...)
  2. git format-patch 7f581e5fabbed21ad8c8ccd3398513d626f01ecf...de85add54522b7ca3b7ad99c7c5ea24525d39ba0e919cd7a -o /root/patch/
分支对比
  1. // -M选项表示这个patch要和那个分支比对
  2. git format-patch -M master
应用
  1. // 检查patch文件
  2. git apply --stat /root/patch/xxx.patch
  3. // 查看是否能应用成功
  4. git apply --check /root/patch/xxx.patch
  5. // 应用patch
  6. git apply /root/patch/xxx.patch
  7. // 应用patch 不必重新commit
  8. git am -s < /root/patch/xxx.patch

diff

Git diff 常见用法
生成标准的patch,只包含diff信息

创建
比较工作区与暂存区
  1. // 不加参数即默认比较工作区与暂存区
  2. git diff
比较暂存区与最新本地版本库(本地库中最近一次commit的内容)
  1. git diff --cached [<path>...]
比较工作区与最新本地版本库
  1. // 如果HEAD指向的是master分支,那么HEAD还可以换成master
  2. git diff HEAD [<path>...]
比较工作区与指定commit-id的差异
  1. git diff commit-id [<path>...]
比较暂存区与指定commit-id的差异
  1. git diff --cached [<commit-id>] [<path>...]
比较两个commit-id之间的差异
  1. git diff [<commit-id>] [<commit-id>]

这个要注意commit-id的顺序,比如说

  1. bf123
  2. ^
  3. |
  4. ag456

现在最新的commit-id是bf123,

  1. bf123的修改:
  2. 1.txt
  3. -------
  4. 1
  5. 2
  6. 3
  7. 4
  8. -------
  9. ag456的修改
  10. 1.txt
  11. -------
  12. 1
  13. 2
  14. -------

也就是说最新的bf123,就是给1.txt增加了两行:3和4

那么:

  1. git diff bf123 ag456

这个得到的diff是:

  1. 1.txt
  2. -------
  3. 1
  4. 2
  5. - 3
  6. - 4
  7. -------

也就是得到了,以bf12为基准,ag456相对于它的改变,也就是去掉了3和4

交换一下顺序:

  1. git diff ag456 bf123

这个得到的diff是:

  1. 1.txt
  2. -------
  3. 1
  4. 2
  5. + 3
  6. + 4
  7. -------

也就是得到了,以ag456为基准,bf12相对于它的改变,也就是增加了3和4

所以,一般来说,我们需要的顺序应该是commit-id的正序排列

应用
  1. // 查看是否能应用成功
  2. git apply --check /root/patch/xxx.diff
  3. // 应用diff
  4. git apply /root/patch/xxx.patch

cherry-pick

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注