简用git
2014-02-16
引言
git 命令有很多,可以看看这篇文章:git命令详解。在实际使用中我们用到的命令可能并不会覆盖到所有,所以我们不一定要对每条命令都熟悉,但是根据实际的情况,按照一定的规范去使用 git 对于团队开发是非常重要的。这里主要就聊一聊我自己平时使用 git 所遵循的一些规范,这些主要是根据我自己的情况总结的,不一定适用于所有人,大家可以多一起讨论,总结出更多场景下的使用规范。
远程分支状态
通常我们的项目建立起来,会随着需求更新迭代出多个的版本。那么我们项目在远程库上的状态一般可能是这种情况:
- remotes/origin/master
- remotes/origin/v1.0
- remotes/origin/v1.1
即项目有 master
v1.0
v1.1
三个分支,其中 master
是我们的主分支,它始终和最新版本的代码保持一致,比如在上面的情况,master
和 v1.1
的最新代码始终保持一致,并且通常我们只由一个或少数几个人管理 master
分支,防止乱套了。v1.0
v1.1
分支是项目的不同版本,v1.0
是旧版本了,通常会已经停止这个版本的开发,如果实在是还要继续在这个分支上的开发,那么其代码将只在该分支上提交,不会往 master
上合并。v1.1
是项目的最新版本,在这个分支上提交的代码,也将往 master
上合并。
使用git
获取代码到本地
通常有下面几步:
git clone git://example.com/myproject // 获取 master 分支到本地
git branch -a // 查看所有分支
git fetch origin v1.1:v1.1 // 获取远程v1.1分支到本地作为v1.1分支
git checkout v1.1 // 切换到v1.1分支工作
git branch v1.1-mine // 在当前分支(v1.1)基础上创建一个新的分支v1.1-mine
git checkout v1.1-mine // 切换到v1.1-mine分支工作
上面的命令有的可以简化,这里就不多讲了。这时候我们就建好自己本地的工作相关分支了。其中包括:
- maser
- v1.1
- v1.1-mine
其中,master
v1.1
分别映射远程分支 remotes/origin/master
remotes/origin/v1.1
,而 v1.1-mine
是我自己习惯创建的一个自己的本地工作分支,一方面可以在开发的过程中可以跟 v1.1
对照,另一方面也可以作为 v1.1
的一个备份,万一弄坏了,直接删掉就好了。
提交代码到远程
通常我都在 v1.1-mine
分支上做开发,做完对应的工作后,就开始代码的提交工作:
// 当前我们的工作分支是 v1.1-mine
git commit -am 'commit message' // 提交代码到本地
git checkout v1.1 // 切换到v1.1分支
git pull origin v1.1:v1.1 // 同步远程v1.1分支和本地v1.1分支
// 上面的这条命令更安全的做法是这样
git fetch origin v1.1:v1.1-tmp // 获取远程v1.1分支代码到本地作为v1.1-tmp分支
git diff v1.1-tmp // 比较v1.1-tmp分支和当前工作分支(v1.1)
git merge v1.1-tmp // 合并v1.1-tmp分支到当前工作分支(v1.1)
// 如果出现冲突,处理冲突...
// 合并、提交自己的代码
git merge v1.1-mine // 合并v1.1-mine分支到当前工作分支(v1.1)
// 如果出现冲突,处理冲突...
git push origin v1.1:v1.1 // 同步本地v1.1分支到远程v1.1分支
// 如果你要管理master分支,你可能还需要这样
git checkout master // 切换到master分支
git pull origin master:master // 同步远程master分支到本地master分支
// 如果出现冲突,处理冲突...
git merge v1.1-mine // 合并v1.1-tmp分支到当前工作分支(master)
// 如果出现冲突,处理冲突...
git push origin master:master // 同步本地master分支到远程master分支
需要注意的是,git pull
命令和git push
命令的格式是这样解读的:
- git pull origin <remote-branch>:<local-branch>
- git push origin <local-branch>:<remote-branch>
上面的过程根据需要可能不同,当遇到冲突的时候更是需要看情况做出适应的处理,总的原则应该是:
- 本地分支跟远程分支一一映射地拉取和提交(v1.1 <-> remotes/origin/v1.1; master <-> remotes/origin/master)
- 本地工作分支(v1.1-mine)往本地对应分支(v1.1)上合并,在合并之前先跟远程分支同步一下(v1.1 <- remotes/origin/v1.1)
使用.gitignore
常规的忽略
使用 git,通常有些内容是需要我们忽略而不应该提交到远程代码服务器的,通常我们需要在项目的根目录下,创建一个 .gitignore
文件,然后在里面按照一定的规则定义我们想要忽略的内容。拿 Xcode 项目来说,我们参考 https://github.com/github/gitignore/blob/master/Objective-C.gitignore 内容如下:
# OS X
.DS_Store
# Xcode
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
profile
*.moved-aside
DerivedData
*.hmap
*.ipa
# CocoaPods
Pods
需要注意的是,我们添加了 .gitignore
文件后,不要忘记把它添加到 git 的管理中:
git add .gitignore // 添加
git commit -am “add gitignore” // 提交
git push origin remote-branch:local-branch // 同步到远程库
自定义ignore文件夹
除了上面常规的需要忽略的内容外,通常我们还希望我们有一个 ignore 文件夹,我们可以方便的把一些东西拖进去使用,但是又不会提交服务器,比如一些素材、第三方库等等。这里的需求是:我们需要 git 来忽略某个文件夹下的所有内容,但是却依然管理这个文件夹。而实际上 git 是不会 track 文件夹的。那我们应该这样做:
-
1)在项目中创建一个文件夹,比如:ignore-folder。
-
2)在该文件夹下添加另一个
.gitignore
文件,并编辑器内容为:
# Ignore everything in this directory
*
# Except this file
!.gitignore
# And you also can add one read me file to log something
!readme
- 3)添加该
.gitignore
文件到 git 管理:
git add project/ignore-folder/.gitignore // 添加
git commit -am “add ignore-folder” // 提交
git push origin remote-branch:local-branch // 同步到远程库
这样就可以方便的使用 ignore-folder
了,不过那些被放进去的文件,如果是项目需要的,那就需要你自己通过其他方式传给你的小伙伴了,一般来说,小伙伴直接原样copy到 ignore-folder
对应的位置就可以了。
=== 文章完 ===