分类 Git 下的文章

git 版本回退

git 版本回退

有这样一种场景: 用git commit几个版本,然后突然发现最近几次ci都有问题,准备取消。

G1 - G2 - G3 - B1 - B2 - B3

G1,G2,G3都是good commit,但是从B1开始,后面的B2,B3都是bad commit。现在要"撤销"几次commit回滚到G3。

理解HEAD

HEAD是git的当前commit的指针,具体含义如下

G1 - G2 - G3 - B1 - B2 - B3
           \    \    \    \-- HEAD
            \    \    \------ HEAD~1
             \    \---------- HEAD~2
              \-------------- HEAD~3

- 阅读剩余部分 -

git merge不同branch文件

平时用git开发过程会有这样一种场景,比如大伙都在branchA上commit,然后有一个临时的需求开了一个branchB,我一个人去那里commit了,大伙还继续在branchA上commit新功能。这时候我需要branchA上的一个新功能(不包含其它未完成的功能)merge到branchB里,也就是说我只需要merge branchA上指定一部分目录或者文件代码。看下面这个例子:

创建branch分支
$ git branch
  * master
$ mkdir dir1
$ cd dir1
$ echo "hello world" > 1.txt
$ git add dir1; 
$ git commit -a -m "add master branch"

创建develop分支
$ git checkout develop
$ mkdir dir2
$ echo "hello world" > 2.txt

master分支有ci
$ git checkout master
$ echo "add by branch master" >> 1.txt
$ git commit -a -m "update master branch"

merge master分支指定目录到develop分支
$ git checkout develop
$ git checkout master dir1/1.txt
  • git merge branchA的file1 到 branchB,仅需这样
$ git checkout branchB
$ git checkout branchA file1

git常用命令

git 撤销

git checkout -- filename 撤销本地文件的修改

git本地分支

Git 分支 - 远程分支

git branch      列出本地分支
* debug
  master
  trunk

git branch -a  列出远程分支
* master
  origin/HEAD
  origin/master
  origin/release
  origin/trunk

git branch trunk        新建trunk分支
git checkout trunk     切换到trunk分支
git checkout -b trunk  新建分支并切换到分支(相当于git branch trunk & git checkout trunk)
git branch -d trunk    删除本地trunk分支

git branch -m <old_branch_name> <new_branch_name>  #git 本地分支重命名

git 远程分支

git checkout -b [分支名] [远程名]/[分支名]
git checkout -b trunk origin/trunk  新建本地分支并且关联到远程分支

git push origin firefoxbug #推送本地分支到远程
git pull origin <remote>:<local> # 更新远程分支到本地

git push origin [本地分支]:[远程分支]
git push origin :firefoxbug #删除远程分支

分支合并

git merge firefoxbug #把[firefoxbug]这一分支merge到当前分支

git reset --hard HEAD #取消合并

git 标签

git的标签主要用于版本发布,可以记录某个版本,其实就是某次commit

git tag 列出现有标签
git tag -a v0.1 -m 'odps_deploy version 0.1' #比如我开发完了version0.1版本,想留着以后回滚
git push origin v0.1 #推送此次tag到远程
git tag -d v0.1 #删除某个tag

git diff

本地工作目录和cache比较

git diff                       本地工作目录和cache比较

git diff filename               指定文件名比较

cache和commit比较

git diff –cached               cache和commit之间的比较

git diff –cached filename      

不通commit版本之间比较

git diff ffd98b291e0caa6c33575c1ef465eae661ce40c9 b8e7b00c02b95b320f14b625663fdecf2d63e74c 查看某两个版本之间的差异

git diff ffd98b291e0caa6c33575c1ef465eae661ce40c9:filename b8e7b00c02b95b320f14b625663fdecf2d63e74c:filename 查看某两个版本的某个文件之间的差异

取消对某个文件的跟踪

$ git rm --cached nginx.tar.gz

git入门二(新建分支)

这一节讲下git的分支功能,分支功能是什么呢?其实这才是真正的软件版本管理核心,比如你的项目想添加一个的功能,但是这个版本是测试的,不一定上线,再或者想开发一个2.0版本专门用于某个场合。传统的做法就是把原来的项目代码,全部都复制一份。然后还傻乎乎地为了区别,把文件夹的名字分成1.0版本和2.0版本,别笑华哥,我之前开发OpenCDN就是这样的。到后来以至于我根本搞不清楚各个版本了,而且还浪费磁盘空间。总之看起来就是很不爽,但是用git可以解决版本控制的问题。

git通过增加分支的方法来实现,git默认的主分支就是master,可以用下面的命令查看。

git branch #查看分支
git branch new_branch #创建一个新的分支
git checkout new_branch #切换到新的分支
git checkout -d new_branch #删除分支

- 阅读剩余部分 -

git入门一(一次commit)

网上git的资料已经很多了,可git这个东西一开始还是比较难理解,以至于我周围的朋友都说这东西太难用了。我自己也玩了两年的linux,但是接触git这个东西一开始还是挺难理解的。其实主要是不像其他工具那样,git还是得静下心来好好看看的。自己对git也不是特别熟悉,所以不能深入解释里面的工作细节,只解释一些常用到的。
在一个项目下面初始化一个git仓库,主要会分成三个部分。一部分是你的工作目录(working),说白了就是你的项目代码。一部分是索引文件(staged file),这里就是你项目的tmp文件。还有一部分是仓库(History),这里才是git真正的数据库,存放你的项目记录的地方。举个例子,我们通用的vim编辑一个文件,一旦开始编辑,目录下就会产生一个.swp文件,然后你编辑完成后按下wq退出,才会真正存到编辑的文件里面。

git1
图片from http://blog.jobbole.com/tag/git/page/2/

git的工作流程也是这样,你初始化一个git仓库后,git监控要指定的文件,你修改了文件之后会暂时存到staged里面去,也就是tmp的部分。当你commit的时候就会真正把tmp里面的文件提交到git仓库里面,这才是真正的一次操作。

- 阅读剩余部分 -