GIT上手入门
一:回顾SVN:
二. GIT简介
Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。[1]
Git是 LinusTorvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Torvalds开始着手开发Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 最近就迁移到 Git 上来了,很多 Freedesktop 的项目也迁移到了 Git 上。
三.GIT的特点:
1.GIT分布式管理。与SVN不同,每次Clone下来的版本是完整的版本库,包含所有历史记录和版本信息。
2.Git的强大之处是分支和合并。
3.管理大型工程的效率非常高。例如:SVN下载Adroid工程要1个工作日,GIT只需要10分钟。
四:HAN350项目快速使用。
gitclone wxm@gitserver:/home/git/work/HAN350.git //从服务器下载A20项目代码。
gitadd . //add修改代码后
gitcommit -m "fix bug of xxx" //提交到本地版本库
gitpush origin master //从本地版本库提交到服务器。
gitpull origin master //从服务器同步代码。
五.常用的GIT命令:
Working DIR: 本地工程路径.
local repository: 本地版本库.
remote repository : 远程版本库.
GIT命令描述:
git clone:从服务器端clone工程
每次Clone下来的版本是完整的版本库,包含所有历史记录和版本信息。
example:
git cloneluohuanran@gitserver:/home/git/work/HAN350.git
Cloning into 'HAN350'...
wxm@gitserver's password:
remote: Counting objects: 288828,done.
remote: Compressing objects: 100%(194230/194230), done.
remote: Total 288828 (delta 80612),reused 288825 (delta 80612)
Receiving objects: 100%(288828/288828), 3.20 GiB | 11.61 MiB/s, done.
Resolving deltas: 100% (80612/80612),done.
wxm@kk-android:~/A20_PRJ/HAN350/HAN350$git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
git remote -v 查看远程版本库(remote repository)。
origin wxm@gitserver:/home/git/work/HAN350.git (fetch)
origin wxm@gitserver:/home/git/work/HAN350.git (push)
gitadd:是把当前Working DIR里面更改或者新增的文件加入Index中,这也是提交之前所需要执行的一步.
gitadd .
git add -f 文件路径 //忽略所有. gitignore
gitrm:从当前的工作空间和index中删除文件。
gitcommit:提交当前Working DIR的add内容,到localrepository
gitstatus: 查看项目中所有文件的状态。哪些被修改,哪些未提交local repository
git push:把本地commit到localrepository的代码更新到remoterepository远程版本库中。
例如:git push originmaster
gitpull:把remoterepository的更新到local repository中,并merge到本地。
例如:
git pull origin master
gitfetch: 把remoterepository的更新到local repository中,不会自动merge.
例如:
git fetch origin master
git log -pmaster..origin/master
git merge origin/master
gitlog:查看历史日志,该功能类似于SVN的log
例如:
git log -p -2 \\ git log -p -2 //-p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新:
gitdiff:查看当前的差异
git diff: 查看working Dir与index的差别的。
git diff --cached:查看index与local repository的差别的。
git diff HEAD: 查看working DIR和local repository的差别的。
git diff origin/master master
查看local repository主分支和remoterepository主分支的差别。
六,分支管理:
目标:团队成员从主分支(master)获得的都是处于可发布状态的代码,而从开发分支(develop)应该总能够获得最新开发进展的代码。
为了便于解决BUG,开发新功能,可以建立“辅助分支”。
“辅助分支”的最大特点就是“生命周期十分有限”,完成使命后即可被清除。
分支操作的常用命令:
git branch <分支名> :创建分支
git checkout <分支名> :切换分支
git checkout master //切换到主分支。
git checkout -b <分支名> //创建并切换分支。
git checkout master file_name //取出主分支的某个文件,覆盖你的工程
git checkout . //取出当前分支的最新代码,覆盖你的工程
git merge: 分支合并
比如,如果要将开发中的分支(develop),合并到主分支(master),
git checkout master。
git merge develop。
如果有冲突,会提示你,调用git status查看冲突文件。
解决冲突,然后调用git add或gitrm将解决后的文件暂存。
所有冲突解决后,git commit 提交更改。
git branch -d: 删除分支
执行git branch -d <分支名>
如果该分支没有合并到主分支会报错,可以用以下命令强制删除git branch -D <分支名>
git cherry-pick <commit id>
对已经存在的commit 进行apply其他其他分支上用法
首先在mater分支修改,然后commit
git checkout old_cc //切换分支
git cherry-pick 38361a68 # apply 某个commit
分支和Patch的结合使用
对于有的大型的LINUX开发者,普通开发者从软件仓库clone下代码,然后编写代码,做一个Patch, 最后用E-mail发给项目的维护者。
我们的项目成员之间,也可以通过发Patch,方便合并代码。
张三:
git branch FixBug // 新建分支
git checkout FixBug // 切换分支
修改代码
git diff master >patch //生成Patch
把patch email给李四。
李四:
git branch PatchTest // 新建分支,避免搞乱主分支。
git checkout PatchTest // 切换分支
git apply patch //打patch
git commit -a -m "apply xxx patch" //提交到本地代码库
七,版本回退:
git checkout commit_id //回退到某个历史版本,并生成一个临时分支。
或
git reset --hard commit_id //回退到某个历史版本,
git pull //返回最新版本
八,把原厂SDK的git工程提交到康佳的git工程上。
在原厂的git工程里面操作步骤:
git remote -v //显示remote
git remote rm origin
git remote add origin 康佳的git工程。
git push origin 分支
九,把整个git工程,迁移到另一个新建立的git工程。
git push --mirror 新的git工程
例如:
git push --mirror git@gitcafe.com/username/newproject.git