git介绍与实战

【引言】大型项目一般使用SVN或git工具进行源代码的版本管理与控制,其中git作为分布式版本控制系统,起初是为了帮助管理Linux内核开发,设计的一种版本控制工具。下面将以git使用流程进行详细介绍,配置与应用场景,常见问题与解决。

Windows/Linux 安装git的方法不再赘述,直接介绍这个工具以及使用方法。

【配置】git作为分布式管理工具,需要输入用户名和邮箱以作为标识,因此,在命令行输入下列的命令:

xiaosanxian@DESKTOP-VFC3POI$ (remotes/origin/develop)
git config --global user.name "username"

xiaosanxian@DESKTOP-VFC3POI$ (remotes/origin/develop)
git config --global user.email "username@gmail.com"

$ git     config   -l   (git  config   --list   --show-origin)    ##查询配置信息
  • : git config --global参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置

【工作原理】

【基本用法】

  1. 创建版本库

版本库(repository)就是我们所说的"仓库",可以把它理解为一个目录,这个目录里面的所有文件都可以被Git管理、修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件"还原"。举个栗子:在当前目录下创建一个名为"lianxi"的版本库。

$ mkdir lianxi
$ cd lianxi
$ git init  ## 将这个目录变为git可以管理的仓库
Initialized empty Git repository in home/***/lianxi/.git/

在“lianxi”目录下创建一个名为“0409.txt”的文件,内容为“123456”。

$ git add 0409.txt  ## 将文件提交到暂存区
$ git commit -m ‘0409.txt commit’  ## 提交这个文件到仓库,单引号内为注释
1 file changed, 1 insertion(+)
$ git status  ## 检查该版本库是否有文件未提交,文件是否有修改

$ git diff    ##查看文件修改的内容

$ git log  ## 获得历史修改记录
版本回退:
$ git reset --hard HEAD^

$ git reflog  ##获取历史版本号

$ git reset --hard 版本号     ##回退到该版本号对应的版本

将本地文件推送到远程仓库中

首先关联本地仓库和远端仓库,执行下面命令:

$ git remote add origin  https://github.com/lianxi/APITest.git
## 第一次推送master分支时,加上了 –u参数,Git会将本地的master分支内容推送的远程新的master分支,还会把2个master分支关联起来,在以后的推送或者拉取时就可以简化操作。

【git命令与gerrit】

gerrit是代码仓库管理平台,提供审查、回退、修改、查询等功能。在gerrit可以有更多的可视化操作,简化git相关命令的使用。其中andorid系统代码,提供了repo命令,对git命令进行二次封装,可用性大大加强。git和repo常见代码与比较:

repo

git

repo checkout branchename

git checkout branchname

切换工作分支

repo sync .

git fetch

拉取服务端代码

repo upload .

git push ***

推送提交到服务器

repo start branchname

git checkout -b branchname -t [target branch]

切换到新工作分支

git add <file>

添加修改到暂存区

git commit -s

提交修改

gits how

查看某一个或者某区间的修改记录。 和'git log -p'类似

git reflog

【git异常操作修复】

git 历史查看和差异对比
    git    log : 查看提交历史记录的修改
        举例:   git  log   -p 查看详细提交历史记录
    
    git  reflog  :查看命令历史的修改记录
    
    git diff   :  查看commit或者分支之间的不同
    
    git show  :  查看某一个或者某区间的修改记录。  和'git    log    -p'类似。
    
使用进行时光穿梭:
    git    reset    --hard   <commit_id>
        • 回到过去       使用git  log 查看提交历史,以便确定要回退到哪个版本。
        • 穿越未来       使用git   reflog 查看历史命令,以便确定要回到未来哪个版本
    
    其他常用”后悔药“命令:
        git  checkout    --<modified_file>     #撤销对未提交&&未暂存文件的修改
        git   revert  <commit_id>    #  撤销已提交的修改
        git   reset  --hard   HEAD^     #  撤销未提交文件的修改
        
    删除分支:
        git branch  -d   devlop (分支名)
        如果devlop分支有新内容没有提交,这样删除会有提示:
            git branch  -D   devlop     # 进行强制删除
        说明: 在gerrit上创建的分支,无法在本地删除,尽量不要在gerrit上创建。
         
    查看最后一次提交日志:
        git     branch   -av
        
    通过 --merged和 --no-merged 来查看分支是否已经合并完成。
        git   branch   --merged
        未合并的分支,在删除时,会提示未合并。
  
    合并分支:
        将devlop合并到master分支下:
        先切回要并入的分支,然后执行。
            git   checkout master
            git  marge   devlop
        在合并的时候,git会报错,显示有冲突,需要手动解决冲突后方可提交。
        使用git  status 查看冲突文件,
        其中,git会在冲突文件上做标示:
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

git cherry-pick和git rebase

git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支v2.0。另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱。但是又想增加一个v3.0 中的功能到v2.0中,这里就可以使用cherry-pick。

    先在v3.0中查看要合并的commit的commit id
    [root@115~~]#git log
        假设是 commit f79b0b1ffe445cab6e531260743fa4e08fb4048b
     
    切到v2.0中
        [root@115~~]#git check v2.0
     
    合并commit
[root@115~~]#git cherry-pick  f79b0b1ffe445cab6e531260743fa4e08fb4048b

【git fetch 和 git pull】

git fetch和git pull都可以将远端仓库更新至本地。

git fetch:这将更新git remote 中所有的远程仓库所包含分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中。

git pull: 首先,基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD记录与远程仓库的版本号,然后git fetch 获得当前指向的远程分支的后续版本的数据,然后再利用git merge将其与本地的当前分支合并。所以可以认为git pull是git fetch和git merge两个步骤的结合。

【gerrit 上显示的“ Code conflict”问题】

    1    如果没有新拉取分支,  执行:   git   pull
    2   当前冲突内容, 在执行完上述指令后,进入代码,就能找到冲突,手动修改冲突。
    3  然后执行 :   git add s-rock-vendor-dev.xml
    4     git cherry-pick --continue     类似于进入:  git  commit  --amend 
    5     git push ssh://username@git.server.cn:28639/platform/manifest HEAD:refs/for/s-dev

【别人gerrit 上的code conflict 问题】

    1. (****重要)  首先切换到项目路径下,新建立分支。
    2. 进行代码同步:    git    pull     ,    或者 :  repo   sync  .
    3. Cherry-pick    对方的代码下来
    4. 手动解决冲突   (删除 <<<  coding   >>>>  部分内容)
    5. 执行:   git   add  ****
    6. 按照提示执行:   git   cherry-pick   --continue   (也有可能是git rebase  **)

    提交:   repo   upload .    (如果有两笔需要提交的代码,会出现选择项) 

【本地编译代码,仓库中多余代码的清理】

    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
        删除:     boot_tools/buildex.log
    执行:git restore --staged boot_tools/buildex.log
    
    尚未暂存以备提交的变更:
      (使用 "git add/rm <文件>..." 更新要提交的内容)
      (使用 "git restore <文件>..." 丢弃工作区的改动)
        删除:     boot_tools/buildex.log
执行:git restore boot_tools/buildex.log boot_tools/buildex.log

【 git add后的文件删除】

    在Git中,删除文件也是一个修改操作,先添加一个新的文件test.txt到Git并且提交
        git add test.txt
    要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
        $ git rm test.txt
        $ git commit -m "remove test.txt"   (可能需要)
        
    另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本。
        $ git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

【Gerrit中两笔提交合并】

    首先将已经提交的代码cherry-pick下来。
        右侧“Download  patch” --->  SSH (cherry-pick)
    下载到本地后,先把需要修改的文件,执行
        git     add
        git    commit   --amend
        repo  upoad   .
完成上述步骤后,就可以把代码合并到一笔提交了。

【拉取别人的代码,到自己的gerrit上】

    1. 先把memory_tools路径,代码进行同步   :   repo  sync    .
    2. 创建新分支:   git   checkout   -b   memory_tools    remotes/pt-s-native  
    3.  从其他地方拉取cherry-pick代码:
        在Gerrit网站右侧,  “Download patch” --->  “cherry-pick”,复制指令到指定项目路径(memory_tools)
    4. 修改当前目录下,你需要修改的代码:   vim  /src/current/mir_iic.c
    5. git    status
    6. git  log   --oneline  -2
    7. git  reset   --soft  71ba6a3(当前修改的这笔提交的,上一笔)
    8. git   add   ***.c
    9. git commit -s 
    10. repo upload .

    ( * ) 出现代码冲突时,需要手动解决冲突后,执行: git  add   ****.c
                        git   cherry-pick   --continue
再执行,步骤6 ,… … 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaosanxian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值