Git

作者: 執著我們的執著 | 来源:发表于2019-08-12 22:45 被阅读0次

Git是一款开源的分布式版本控制系统,由linus领头开发,初衷是用其管理Linux内核庞大的开源代码.

1. Git 基本概念
  • 工作拷贝(work copy):也称为工作区,用于存放产品开发数据本地工作目录

  • 索引(index): 用于存放待提交数据的缓存区

  • 本地库 : 远端库的一个完整的拷贝,包括所有文件的修改记录,分支等

  • 远端库 : 本地库clone的来源

  • 中心库 : 远端库的一种,公司级存放某个项目所有产品数据的仓库

  • 快照(snaoshot) : 版本库某个时间点所有文件集合

  • 全球版本号(commitID) : Git库的版本号是通过 SHA-1算法根据库中的所有内容计算出一个40位的哈希值,这个哈希值是全球唯一的,基本只要前六位就可以唯一标识了

  • 文件状态介绍 :

    • untracked files : 未被跟踪的文件,一般指新添加的文件
    • Change not staged for commit : 已修改的文件,包括modified和deleted状态
    • change to be commit : 已缓冲的文件,即已 add 的文件,包括 modified,deleted 和 new file 状态
    • Noting to commit : 已提交的文件

补上一个图,一目了然


2. 常见操作
  • 克隆中心库到本地
    git clone 中心库名称地址 本地工作目录名称

  • 新增或修改文件,将需添加的文件转移至缓存区
    git add

  • 提交, 将所有缓存区的修改提交到本地版本库
    git commit
    git commit --amend : 修改最新一次的提交,保持change ID不变

  • 取消已缓存的修改(回退)
    git rm --cached 文件名 : 将新添加的文件返回到未被追踪的状态,即从缓冲区删除,但不影响本地内容
    git reset HEAD 文件名 : 回退库上的提交 ,同样不影响本地内容

  • 删除文件
    git rm 文件名 : 只是删除文件并将删除的信息转移至缓存区

  • 取消本地文件的修改,包括删除的文件
    git checkout -- 文件名 : 删除本地修改未上传的文件
    git clean -f : 删除本地未被跟踪的文件

  • 重命名文件或目录
    git mv 原文件名 新文件名 : mv后直接到缓存区

  • 查看文件状态
    git status

  • 比较文件
    git diff
    git diff OldcommitID NewcommitID(前6位)
    git diff HEAD/master

  • 查看修改日志
    git log

  • 创建私有分支
    git branch 分支名 commitID
    git checkout -b 分支名 commitID
    注:此操作是基于commitID 拉出新分支,如果没有则基于当前分支的HEAD拉出新分支。
    git checkout -b 分支名 commitID = git branch 分支名 commitID + git checkout 分支名

  • 合并分支
    1、直接合并 : git merge 分支名
    注:此操作是将“分支名”指示的分支合并到当前所在的分支,所以合并前必须切换到目标分支。
    2、拣选合并 : git cherry-pick commitID
    注:将某次特定提交合并到当前分支,首先合并前必须切换到目标分支。

  • 查看分支
    git branch :查看当前git库中的所有分支,“-r”是查看git库中对应的远程分支参照。

  • 检查分支是否合并到当前分支
    git branch ––merged :查看已经合并到当前分支的所有分支。
    git branch ––no-merged :查看还没有合并到当前分支的所有分支。

  • 删除私有分支
    git branch –d/-D 分支名
    注:此操作”-d”删除分支前会检查分支中的内容是否都已经合并到其他分支,如果没有,则命令不执行;
    ” -D”不进行检查,直接删除分支。

  • 重命名分支
    git branch -m oldbranch newbranch
    注:此操作是将oldbranch分支的名称改成newbranch。如果需要拉出分支,并同时切换到新分支可以用git checkout –b oldbranch newbranch

  • 上传修改到中心库
    git push 远端库名称 本地分支名称 :远程分支的名称
    注:此操作是将本地库的修改同步到中心库,如果本地分支的名称和远程分支的名称相同,则远程分支名称可省略。
    git push origin new:new_br

  • 更新当前模块(不推荐用git pull命令强制将更新合并到本地)
    git fetch 远端库名称 : 获取远端库的更新到本地库
    例如 : git fetch origin
    git merge 远程库名称/分支名称 : 将中心库的更新合并到本地工作目录中
    例如: git merge origin/new_br

  • 修改提交信息
    git commit –m “新的提交信息” –-amend
    注:此操作只能修改最新的一次提交,之前的提交无法修改。

  • 回退某一历史版本,然后提交到本地库
    git revert 全球版本号 :此操作将回退记录到历史的某一节点,并作为一次新的提交到库中。

  • 回退操作
    1、需要重新提交,修改的内容保持不变。使用git reset commit-id(上一个节点的commit-id)
    2、撤销提交:使用git reset –hard HEAD~1(HEAD^)
    注:上面两个reset的区别是,修改的内容是否需要保留;

  • 暂存本地修改
    git stash : 将本地未提交的修改暂存起来,并将文件状态恢复到HEAD,如果要恢复暂存的修改,运行git stash pop即可,非常适合临时插入的紧急bug修改

  • 变基
    git rebase 目标分支 原分支 :此操作将原分支变基到目标分支HEAD上。

  • 解冲突
  1. git feach 拉回来的代码与本地发生冲突
  2. git status . 和 git diff . 查看冲突的文件及其具体位置
  3. vim 修改具体的冲突
  4. git status . 解冲突后的状态
  5. git add . :将解好冲突的文件add到暂存区(stage)
  6. git cherry-pick --continue : cherry-pick 一下
  7. git commit --amend : commit到本地仓
    辅助:git status . ; git show HEAD 瞄一眼检查一下修改处
  8. repo upload . : 将解决的冲突上传到 Gerrit
  • Git帮助查询
    git help
    git help cmd


Git常用命令集合整理

Git基础命令 说明
git init 初始化新项目
git status 查看文件状态
git add 将文件添加至暂存区
git commit 提交暂存区文件
git log 查看提交历史
git config --global user.name "<name>" 配置用户name

例子

使用 Git 创建项目流程
mkdir testProject
cd testProject
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin git@192.168.1.1:test.git
git push -u origin master
// 获取现有的项目
git clone git@192.168.1.2:test.git


基于分支的提交流程 说明
git checkout -b myfeature 新建并切换到新功能分支 myfeature
git add files 添加新文件到暂存区
git commit -a -m "修改原因" 将暂存区所有修改提交
git checkout develop 切换回开发分支develop
git merge myfeature 合并新功能分支
git branch -d myfeature 删除新功能分支
git pull 获取并合并远程服务器最新代码
git push 推送本地分支到远程服务器对应分支

注 : 养成先 pull 再 push 的好习惯


Git分支管理
  • 主要分支(长期存在) :
    master 主分支(除非重大bug,会分出hotfix分支)
    develop 开发分支(用来另外分支出 Release,Feature)
  • 次要分支
    Feature功能分支(由develop直接分支,开发新功能)
    Realease预发布分支(由develop直接分支,开发下一版Release)
    Hotfixs(由master直接分支,修复bug)
Git分支管理 - 特性功能分支 说明
git checkout -b myfeature develop 新建并切换到新功能分支myfeature
git add .
git commit -a -m "修改注释" 修改代码后commit
git checkout develop 切换回开发分支develop
git merge --no-ff myfeature 合并新功能分支
git branch -d myfeature 删除新功能分支
git pull 获取并合并远程服务器最新代码
git push origin develop 推送本地分支到远程服务器对应分支

Git分支管理 - 发布功能分支 说明
git checkout -b release-1.1 develop 新建并切换到新功能分支
git add .
git commit -a -m "Update:release 1.1" add & commit
git checkout master 切回master分支,并合并release-1.1分支
git merge --no-ff release-1.1 合并
git tag -a v1.3 -m "Release v1.1 Tag" 在master 上面加上新tag
git checkout develop 切回develop分支,并合并release-1.1分支
git merge --no-ff release-1.1 合并
git push 上传
git push origin v1.1 将新 TagV1.1 更新到 origin/master

查看、添加、提交、删除、找回,重置修改文件
Git命令列表 说明
git help <command>
git show 显示某次提交的内容
git show $id
git checkout -- <file> 抛弃工作区file的修改
git checkout .
git add 工作区add到暂存区
git rm <file> 从版本库中删除文件
git rm <file> --cached 从版本库中删除文件,但不删除文件
git reset 从暂存区恢复到工作文件
git reset -- .
git reset --hard 恢复最后一提交的状态
git commit <file>
git commit -a 将 git add , git rm 和 git commit等操作都合并在一起做
git commit -am "comments" 有注释的commit
git commit --amend 与上次提交同commitId
git revert <$id> 恢复某次提交的状态,恢复动作本身也创建一次提交对象
git revert HEAD 恢复最后一次提交的状态

查看文件diff 命令列表 说明
git diff <file> 比较当前文件和暂存区文件差异
git diff <id1> <id2> 比较两次提交之间的差异
git diff <branch1>..<branch2> 比较两个分支之间的差异
git diff --staged 比较暂存区和版本库的差异
git diff --cached 比较暂存区和版本库的差异
git diff --stat 仅仅比较统计信息

查看提交记录 命令列表 说明
git log
git log <file> 查看该文件每次提交记录
git log -p <file> 查看每次详细修改内容的diff
git log -p -2 查看最近两次详细修改内容的diff
git log --stat 查看提交统计信息

查看、切换、创建和删除分支 命令列表 说明
git branch -r 查看远程分支
git br <new_branch> 创建新的分支
git br -v 查看各个分支最后提交的信息
git br --merged 查看已经被合并到当前分支的分支
git br --no-merged 查看尚未被合并到当前分支的分支
--- ---
git checkout <branch> 切换到分支branch
git co -b <new_branch> 创建新的分支并且切换过去
git co -b <new_branch> <branch> 基于branch创建新的new_branch
git co $id 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除
git co $id -b <new_branch> 把某次历史提交记录checkout出来,并创建一个新的分支
--- ---
git br -d <branch> 删除某个分支
git br -D <branch> 强制删除某个分支(未被合并的分支被删除的时候需要强制)
--- ---
git merge <branch> 将 branch 分支合并到当千分之
git merge origin/master --no-ff 不要 Fast-Foward 合并,这样可以生成 merge 提交
git rebase master <branch> 将master rebase 到 branch,相当于 git co <branch> && git rebase master && git co master && git merge <branch>


Git暂存管理 命令列表 说明
git stash 暂存
git stash list 列所有的stash
git stash apply 恢复暂存的内容
git stash pop 恢复暂存的内容
git stash drop 删除暂存的内容

Git远程分支管理 命令列表 说明
git pull 抓取远程仓库所有分支更新并合并到本地
git pull --no-ff 抓取远程仓库所有分支更新并合并到本地,不要快进合并
git fench origin 抓取远程仓库更新
git merge origin/master 将远程主分支合并到本地当前分支
git co --track origin/master 跟踪某个远程分支创建相应的本地分支
git co -b <local_branch> origin/<remote_branch> 基于远程分支创建本地分支,功能同上
git push push所有分支
git push origin master 将本地主分支推到远程主分支
git push -u origin master 将本地主分支推到远程主分支(如无远程主分支则创建,用于初始化远程仓库)
git push origin <local_branch> 创建远程分支,origin是远程仓库名
git push origin <local_branch>:<remote_branch> 创建远程分支
git push origin:<remote_branch> 先删除本地分支(git br -d <branch>),然后再push删除远程分支

Git远程仓库管理 命令列表 说明
git remote -v 查看远程服务器地址和仓库名称
git remote show origin 查看远程服务器仓库状态
git remote add origin git@github:robbin/robbin_site.git 添加远程仓库地址
git remote set-url origin git@github.com:robbin/robbin_site.git 设置远程仓库地址(用于修改远程仓库地址)
git remote rm <repository> 删除远程仓库
创建远程仓库
- git clone --base robbin_site robbin_site.git  # 用带版本的项目创建纯版本仓库
scp -r my_project.git git@git.csdn.net:~  # 将纯仓库上传到服务器
- mkdir robbin_site.git && cd robbin_site.git && git --bare init # 在服务器创建纯仓库
git remote add origin git@github.com:robbin/robbin_site.git   # 设置远程仓库地址
git push -u origin master # 客户端首次提交
git push -u origin develop # 首次将本地develop分支提交到远程develop分支,并且track
git remote set-head origin master #设置远程仓库的HEAD指向master分支

写在最后 : 实践是检验灵活使用工具的唯一标准
教程推荐 : Git教程-廖雪峰

相关文章

网友评论

      本文标题:Git

      本文链接:https://www.haomeiwen.com/subject/sxuuzqtx.html