Git

成为Git使用高手

2019-08-16  本文已影响0人  时间道

现在日常开发中都使用 git 作为源码管理工具,git 功能非常强大,但是对于研发不熟悉导致的问题也非常多,问题很多通常出现在使用 idea、eclipse 等开发工具操作 git 的时候,工程师还是需要对 git 的运行机制深入了解一下。本文主要叙述使用 git 命令来工作,包括git的工作流模式、使用中遇到问题的应对方式,熟练使用这些命令,足以应付日常开发了。


Git介绍

Git 是一套内容寻址文件系统,git本地保存快照和更新历史。对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。

Git工作模式

  1. 在工作目录中修改某些文件。
  2. 对修改后的文件进行快照,然后保存到暂存区域。
  3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。
  1. 创建一个主仓库
  2. 每个人开发者fork一份开发库
  3. 开发者在自己fork出的代码里做开发
  4. 开发完后 pull request ,等待code review 审核合并代码
  5. 如果主仓库有更新,先fetch,然后合并到自己的仓库里

下面会详细叙述 git flow 开发模式,如果需求频繁,又多人协作开发,而且需求发版和开发周期又很不固定的话,建议使用此模式。

git flow研发模式:

git flow 开发模式,侵权删
  1. 创建develop分支
git branch develop
git push -u origin develop
  1. 克隆中央仓库,建好develop分支的跟踪分支
git clone ssh://user@host/path/to/repo.git
git checkout -b develop origin/develop
  1. 基于develop建一个开发分支
git checkout -b some-feature develop
git push --set-upstream origin test-feture  把创建的分支上传
  1. 开发完成后,合并到 develop 分支
git pull origin develop  合并功能前确保develop分支是最新的   git fetch --all
git checkout develop
git merge some-feature  合并
git push
git branch -d some-feature   删除功能分支
//开发命令
git status  查看状态
git add . 添加所有
git commit -a -m "描述"
git push 分支提交
  1. 准备发布:从develop拉一个release分支
git checkout -b release-0.1 develop
  1. 发布完成后,合并到master、develop,删除release分支:
git checkout master
git merge release-0.1
git push
git checkout develop
git merge release-0.1
git push
git branch -d release-0.1
  1. 给master打tag:
git tag -a  0.1 -m "Initial public release" master
git push --tags 或者 git push origin 0.1
  1. 如果发现bug,要从master拉一个hotfix分支,修复bug,合并到master:
git checkout -b issue-#001 master
# Fix the bug
git checkout master
git merge issue-#001
git push
  1. 合并到develop:
git checkout develop
git merge issue-#001
git push
git branch -d issue-#001

其他命令

  1. git log 查看日志
  2. 已经commit的回退到指定版本号:
git reset --hard commit_id 
    git push origin HEAD --force
  1. 撤销文件等
//撤销所有的已经add的文件
git reset HEAD .  
// 撤销某个文件或文件夹:
git reset HEAD -filename
// 撤销对所有已修改但未提交的文件的修改,但不包括新增的文件
git checkout .   
// 撤销对指定文件的修改,[filename]为文件名   
git checkout [filename]     
  1. git 更改远程仓库地址:
    origin 是默认的指向远程代码库的名称,可以更改; 也可以通过添加新的指向来指定到多个远程代码库
git remote 可以列出当前的仓库名称
git remote -v 列出当前仓库列表
git remote rm origin 先删除
git remote add origin git@legitlab.letv.cn:lemall-frd-activity/activityops.git   再添加
  1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge
  2. git pull:相当于是从远程获取最新版本并merge到本地
  3. git checkout -f branchname 强制覆盖本地文件
  1. 删除远程分支:
git push origin :branch-name

删除远程分支后,也要再删除本地分支,要不然会被重新提交上去。

  1. 打tag相关:
git tag -a master-2018-01-25 -m 'message'
git push origin master-2018-01-25
// 删除本地标签:
git tag -d 标签名
// 删除远程标签:
git push origin :refs/tags/标签名
  1. 出现have diverged的情况下,处理方式:
git fetch origin
git reset --hard origin/test
  1. 将本地仓库同中央仓库同步
git remote show origin 查看中央仓库信息
git remote prune origin  删除本地的已经在远端不存在的分支
  1. master 需要回退时,可以执行如下操作
git reflog show <branch name> 显示本地操作历史
master回退到指定的tag:
git show tag_name
git reset --hard  tag_id
git push -f -u origin master  //强制提交,需要确保master没有被锁定
  1. 多人协作开发时,如果git 合并不当很容易出现代码冲突、覆盖别人代码的问题:
    提交顺序:提交前先add 然后commit,然后再git pull--> 处理合并 --> 处理了合并之后,再commit --> 然后再push
    git fetch --all 并不会把更新的东西在当前展现,git log也看不到,只有执行了 git pull 之后git log才能看到其他人的更改
    git rebase —abort 回退到合并前

  2. 回退到指定提交的commit id

git reset --hard ,是回退到本地commit 的版本
回退到指定commit 版本,git reset --hard commitid
撤销本地所有修改:git reset --hard hash 或者git checkout <sha1-of-a-commit 历史版本>
git reset --hard HASH #返回到某个节点,不保留修改。
git reset --soft HASH #返回到某个节点。保留本地修改内容
git rebase —abort 回退到合并前
git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态
  1. git stash #把所有没有提交的修改暂存到stash里面。可用git stash apply恢复。

  2. 开发分支操作

git branch -d **** 删除本地分支
git branch -a  查看远程分支
git branch  查看本地分支
git branch test 本地创建分支
git push origin test 把分支推到远程
git push origin :br-1.0.0 删除远程版本
  1. 本地更换git远程地址:
git remote rm origin
git remote add origin git@inside-git.01zhuanche.com:mp/sq-usercenter.git
  1. 代码导出
    git archive --format zip --output './out.zip' master
    可以通过format指定导出代码的格式
上一篇 下一篇

猜你喜欢

热点阅读