GIT个人手册
版本 |
日期 |
修订内容 |
作者 |
V01 |
2019-06-25 |
初稿 |
|
备注: 使用中不断迭代完善,其他人使用中有其他总结的,可以补充。 |
目录
一.1.2 git仓库说明(工作区、暂存区、本地仓、远程仓)1
一.1.3 git仓库说明(工作区、暂存区、本地仓、远程仓)2
四.11.4 git commit将暂存区中的文件提交到本地仓库中
四.13.3 merge、rebase、cherry-pick、revert
四.13.4 reset(恢复某版本之后的不要)和revert(恢复某版本到下一版本)
四.13.6 Github中fork 和 clone的区别 pull request
第一章 说明
一.1.1 GIT 中文手册
https://cloud.tencent.com/developer/section/1138656
一.1.2 git仓库说明(工作区、暂存区、本地仓、远程仓)1
我们先来理解下Git 工作区、暂存区和版本库概念
工作区:
也叫 工作树,就是你在电脑里能看到的目录。
暂存区:
英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。
图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
一.1.3 git仓库说明(工作区、暂存区、本地仓、远程仓)2
git有好几个区,工作区(workspace)、暂存区(index)、本地仓库(local repository)、还有远程仓库(remote repository)。远程仓库为我们保存一份代码,如github,而工作区、暂存区和本地仓库都在本地,这也就是为什么我们在没有网络的环境下也能使用git提交(commit)代码,因为提交仅仅是提交到本地仓库中,待有网络之后在推送(push)到远程仓库。
第二章 提交代码的一个完整流程
由上面的内容,不难发现,从一开始的git status命令,根据相关提示,引出了其他相关命令。下方是对其相关命令的总结:
git status : 查看当前仓库中文件的状态。
git status -s : 文件状态的简写(M - 修改, A - 添加, D - 删除, R - 重命名,?? - 未追踪)。
git add <文件名> :将后方紧跟的文件进行暂存,以便commit使用。
(git add == git stage,推荐使用git stage代替git add,git add 只是为了和旧命令兼容)
git reset HEAD <文件名> : 将已经暂存的文件进行撤销,回到未暂存的状态。
git checkout -- <文件名> :撤销对尚未暂存文件的修改,该操作不可逆,慎用。
git commit -a : 对那些被修改的文件单尚未暂存和提交的文件进行暂存和提交。注意:对未暂存的新增文件无效。
git commit : 对暂存区的文件进行提交到本地仓库。
git push : 将本地仓库已经提交的内容发布到远端。
(我们团队提交的 git push origin HEAD:refs/for/xxxx
先提交到HEAD:refs/for/下的分支,构建测试。
如:git push origin HEAD:refs/for/CI_2/spaDev)
第三章 GIT 使用规范
https://www.cnblogs.com/gzpblog/p/5463031.html
第四章 简略
四.1 git fetch /pull/checkout拉取代码
四.1.1 取远程仓代码
四.1.1.1 例子
例子1:
如果本地代码有修改则 先将本地的代码做本地提交:
git commit -m “change log...”
git fetch orign //拉取服务器上的代码
git branch -a //查看全部分支
git rebase remotes/origin/tb_gl5118b_dev_v1.9_ble //将拉取的代码合并到本地
例子2:
//查询当前远程的版本
$ git remote -v
//获取最新代码到本地(本地当前分支为[branch],获取的远端的分支为[origin/branch])
$ git fetch origin master [示例1:获取远端的origin/master分支]
$ git fetch origin dev [示例2:获取远端的origin/dev分支]
//查看版本差异
$ git log -p master..origin/master [示例1:查看本地master与远端origin/master的版本差异]
$ git log -p dev..origin/dev [示例2:查看本地dev与远端origin/dev的版本差异]
//合并最新代码到本地分支
$ git merge origin/master [示例1:合并远端分支origin/master到当前分支]
$ git merge origin/dev [示例2:合并远端分支origin/dev到当前分支]
原文:https://blog.csdn.net/hanchao5272/article/details/79162130
四.1.1.2 git fetch
git fetch将远程主机的最新内容拉到本地仓,用户在检查了以后决定是否合并到本地工作本目录
$ git fetch <远程主机名> //这个命令将某个远程主机的更新全部取回本地
$ git fetch <远程主机名> <分支名>取回特定分支的更新,可以指定分支名
$ git fetch origin master 最常见的命令如取回origin 主机的master 分支
取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:
$ git log -p FETCH_HEAD
git fetch后的合并:
四.1.1.3 git pull
git pull 将远程主机的最新内容拉下来到本地工作目录后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
git pull 的过程可以理解为:
git fetch origin master //从远程主机的master分支拉取最新内容
git merge FETCH_HEAD //将拉取下来的最新内容合并到当前所在的分支中
即将远程主机的某个分支的更新取回,并与本地指定的分支合并,完整格式可表示为:
$ git pull <远程主机名> <远程分支名>:<本地分支名>
如果远程分支是与当前分支合并,则冒号后面的部分可以省略:
$ git pull origin next
//查询当前远程的版本
$ git remote -v
//直接拉取并合并最新代码
$ git pull origin master [示例1:拉取远端origin/master分支并合并到当前分支]
$ git pull origin dev [示例2:拉取远端origin/dev分支并合并到当前分支]
原文:https://blog.csdn.net/hanchao5272/article/details/79162130
四.1.2 取本地仓代码
git checkout迁出一个分支的特定版本。默认是迁出分支的HEAD版本
一此用法示例:
$ git checkout master #//取出master版本的head。
$ git checkout tag_name #//在当前分支上 取出 tag_name 的版本
$ git checkout master file_name #//放弃当前对文件file_name的修改
$ git checkout commit_id file_name #//取commit_id提交版本的file_name
$ git checkout -b dev/1.5.4 origin/dev/1.5.4
# 从远程dev/1.5.4分支取得到本地分支/dev/1.5.4
$ git checkout -- hello.rb
#这条命令把hello.rb从HEAD中签出.
$ git checkout .
#这条命令把 当前目录所有修改的文件 从HEAD中签出并且把它恢复成未修改时的样子.
#注意:在使用 git checkout 时,如果其对应的文件被修改过,那么该修改会被覆盖掉。
https://www.yiibai.com/git/git_checkout.html
四.2 git init Git 创建仓库
git init 当前目录创建
git init newrepo 在newrepo目录创建
$ git add *.c $ git add README $ git commit -m '初始化项目版本' 以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。 |
四.3 git clone拷贝项目
git clone <repo> :从现有 Git 仓库中拷贝项目(类似 svn checkout)。
git clone <repo> <directory>:克隆到指定的目录
$ git clone <版本库的网址> <本地目录名>
$ git clone https://github.com/tensorflow/tensorflow.git
或者使用SSH协议:
$ git clone git@github.com:tensorflow/tensorflow.git
例子:
$ git clone git://github.com/schacon/grit.git
$ git clone git://github.com/schacon/grit.git mygrit
几种效果等价的git clone写法:
git clone http://github.com/CosmosHua/locate new
git clone http://github.com/CosmosHua/locate.git new
git clone git://github.com/CosmosHua/locate new
git clone git://github.com/CosmosHua/locate.git new
四.4 git branch分支管理:查看/新建/删除
git branch 查看本地分支(同git branch -l),
git branch -r 查看远程分支
git branch -a 查看本地和远程所有分支
git branch <branchname> //新建分支
git branch -d <branchname> //删除本地分支
git branch -d -r <branchname> //删除远程分支,删除后还需推送到服务器
git push origin: <branchna