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

由于整个项目的管理都是通过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之后才到本地仓库里面关于本地工作目录(本地分支),暂存区,本地仓库可以参考:
 
          

 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 树。



 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值