您的位置:首页 > 其它

git 操作总结(整个工作流程)

2015-01-30 14:47 387 查看
由于整个项目的管理都是通过git来实现的,所以想把整个操作流程记下来,以便更好地理解git.



一、git的工作原理

1.1 本地工作目录, 本地仓库, 远端的代码仓库

git是分布式代码管理工具,在远程有个代码仓库R(repository),是项目整个的代码,因为是分 布式的,
所以所有人都可以git clone一份原始的代码到自己的电脑上,然后git checkout到本地分支,也称为本地工
作目录D(work directory),然后每个人可以在自己本地的这份代码里面添加自己的代码,添加新的功能,
为了安全,维护方便,D和R之间多了个本地仓库,就是说用户更改完代码之后,不直接 ---对于修改的文件fiel1, 标注它已经被更改了 <.5��理几个commit,生成几个patch)
2. git format-patch -1 commit_id 生成该commit_id的patch
3. git format-patch HEAD~2 生成前2个commit的2个patch

六、发送email

git send-email --suppress-cc all --to "email_address" patches/*.patch

其他:打补丁

1. git am patch ---出错,git am --abort退出
2. git diff HEAD~ > XXX.diff + patch -pl < xxx.diff

git pull中若出现冲突

1) 用git format-patch HEAD~n生成相应commit的patch

2) git am --reject xxx.patch分个打patch,若失败,则查看patch代码冲突的地方, 修改后,记得git add + git am --continue

+++++++++++++++++++++++++++++++++++++++++++++++++
在当前分支,比如vfio_ccw分支里面,与最新的devel合并时git merge devel,出现了冲突:
CONFLICT(content): merge conflict in ***/***/***.c
解决冲突:
git mergetool (使用图形化工具可以很清楚地对比不同文件,看到冲突的地方)将《《《《 ======》》》》 的部分解决冲突
然后git add --all +git commit -a 进行commit。�%B把更新推送(git push)
到远端的代码仓库,而是先推送(git add,git commit)到自己本地的仓库(git directory),这个本地仓库可以认为是
虚拟存在,但是你所做的commit操作,git里面会自动将其更新到本地仓库). 在向远程push之前,很多项目会使用本地
仓库的更新(patches)进行组内的讨论,如果需要修改的话,可以直接在本地分支更改,然后更新到本地
仓库,直到大家都满意。然后推送的时候,使用git push推送到远端的代码仓库。

在本地,本地工作目录和本地仓库之间,还有一个暂存区叫staging area, git add之后,那些修改会暂存在
staging area里面,commit之后才到本地仓库里面关于本地工作目录(本地分支),暂存区,本地仓库可以参考:
/article/9168858.html



1.2 代码分支

为了便于管理和基于安全考虑, 尤其当你要维护一个长期项目:如稳定版本,测试阶段版本,开发版本等
情况的时候,就要用到分支了,git使用分支(branch)来承载新的功能,就是用户不直接在整个项目代码里面
添加新的功能,而是从主代码上生成自己的分支(最初它跟整个项目代码是一样的),此时,远端的分支
就算是一个远端的代码仓库(repository), git clone 整个代码仓库之后,在本地repository(这个跟远端仓库是
完全一样的),可以进入(checkout)自己的分支(本地工作目录),也可以在本地新建其他分支(新建分支时,
要注意新生成的分支是基于当前分支的,即与当前分支完全一样的)。

1.3. 分支合并

因为本地的分支在修改的过程中,远程的devel分支可能已经被更新了,所以在push到远程仓库之前,需要先
更新devel到最新,然后与devel合并之后,再提交
git checkout devel
git pull
git checkout mybranch
git merge devel
打上patch
git push origin remotebranch

二、 git 的安装和设置

1. 安装git: yum install git
2. 生成公私钥对:ssh-keygen -t rsa
在~/.ssh目录会生成两个文件: id_ras, id_rsa.pub,根据rsa加密和数字认证的原理,将公钥id_rsa.pub
放到代码仓库所在服务器上,由代码管理员授权你这个用户可以对远端项目代码进行某些操作,比如
git clone,git push等。(ps: 在任何一台机器上,只要有id_ras,即你的私钥,就可以进行上面的授权操作)
3. git的配置文件在~/.gitconfig里面,可以配置默认的用户名,邮件
[user]

name = Xiao**

email =
renf@***.**.com

[core]

editor = vim

[sendemail]

smtpserver = ap.relay.*****.com

from = Xiao Feng Ren<renxiaof@***.com>

confirm = always

smtpserverport = 25

[pull]

rebase = true

三、clone,建立本地分支

1. git clone ssh://git@9.152.111.***/Linux ---从远端repository复制一份到到本地仓库
git branch ---查看本地分支,此时只有一个master分支
git branch -a ---查看远程所有分支
2. git branch test1 ---新建一个本地分支
git branch origin test1-----推送commit到远程仓库,
若test1不存在,则新建远程分支)---origin这里是远程主机名
3. git checkout test1 --- 将仓库中test1分支上面的所有代码check到本地工作目录,即成为本地分支
如果test1是新建的分支,那么它的内容就跟当前分支(此时是master)完全一样
这个时候使用git branch将看到test1前面有个 * 号,说明此时将
要进行的所有操作都是在test1分支上发生
git checkout -b test2 --- git branch test2 + git checkout test2
4. git branch -d test1 --- 删除一个分支(此时不能删除test2,因为test2此时是当前分支)
git branch origin :test1 -----删除远程分支

四、更新

0. git pull origin test1 --- 将远端分支test1的更新到本地(因为这个分支可能有好几个在
共同合作,如果远端分支还没有建立,这步省略)
git fetch origin test1 + git merge ---等同于git pull,fetch只是把远程库拿下来,merge合并的时候,如果出现
冲突,则先解决冲突再合并,同步远程 (可以看上图)

修改文件file1
git status ---对于修改的文件file1, 此时它是红色的
1. git add file1 C�如果单纯滴git commit -s“xxxx" 会出现fatal: cannot do a partial commit during a merge.

对于其他情况出现提交时这样的提示,不想提交所有的修改,可以用:
git commit file/to/path -i -m "merge"

在git push origin xxxx 的时候,出现hook declined ... 原因是权限不对,是否用户名正确?或者:

修改服务器端的接收配置:

git config receive.denyCurrentBranch ignore

2: 本地机器可以向远程分支提交代码,但是文件无法提交到远程服务器上。

解决方法:使用命令rm -rf .git移除隐藏的git文件夹,而后重新git init;此时远程文件信息已被删除,需要重新添加,可通过更改.git文件夹中的config文件方式手动添加,修改为:

[remote "origin"]

url = ssh://zxiaol@tuxmaker.boeblingen.de.ibm.com

+++++++++++++++++++++++++++++

问题:

有9个commit,编译没有问题。然后与最新的devel合并,有冲突,直接使用了vim 解决了冲突(应该使用git mergetool就会避免解决冲突了之后提交先前的文件并没有真正提交)。

合并完之后,git log

commit 1 merge devel ...conflict files:

conflict file1

conflict file2

conflict file3

commit 2

commit 3

.....

commit 10

commit11

编译的时候,出现了问题,是commit3里面的问题,但是这个改动不会影响到其他commit,所以我想使用rebase -i 来将新的改动合并到commit3里面,但是发现不行

因为会影响到commit1里面影响到的其他文件,所以只好rebase abort。。然后又想着是否可以git reset --hard 回到commit2, 但是也是不行的,因为merge只后,devel

里面新的commit已经加入,比如commit11就是新的commit。。做了reset hard之后,最上面是commit2,但是git status的时候你还是会看到很多新加的文件,等着你去add.

然后我使用了git checkout commit2,回到了commit2这个地方, 但是同样的有很多未add的文件, 最后我就想先把这些文件add-commit之后,然后他们就成为了一个新的

commit,接着在git reset --hard commit2, 这下解决了。而现在的处理是在一个暂时的“branch"上,基于checkout到某个commit(这里是commit2), 所以我又重新生成了

一个新的branch, 直接git branch ****, 就是基于这个已经解决的”branch" 生成了新的branch。。。(问题解决了,但是原理还不是很清楚为啥?)那些新增的文件是否是因为解决冲突的时候没有用mergetool, 直接vim,add,commit,但是实际上很多受影响的文件并没有提交? 还是merge devel之后新的文件加入了,但是后来又reset --hard回去,有些文件并没有reset成功?

如何回到某个commit为HEAD, git checkout ****

git log --oneline --graph --decorate --all --color --查看当前的commit 树。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: