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上。
- 解冲突
- git feach 拉回来的代码与本地发生冲突
- git status . 和 git diff . 查看冲突的文件及其具体位置
- vim 修改具体的冲突
- git status . 解冲突后的状态
- git add . :将解好冲突的文件add到暂存区(stage)
- git cherry-pick --continue : cherry-pick 一下
- git commit --amend : commit到本地仓
辅助:git status . ; git show HEAD 瞄一眼检查一下修改处- 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 <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教程-廖雪峰