作为开发平时使用Git版本管理工具是必不可少的,于此记录一下自己平时使用到和理解的部分命令,有疑点欢迎回复会及时更正,望互相学习互相进步。
GIT特点:
1.下载后本地本身就是一个版本库
2.速度快超过绝大部分的版本管理
3.强大的分支管理
4.活跃的github开源社区
与SVN做个比较加深理解:
1.GIT天生就是分布式
2.版本机制:SVN 存储的是变化,GIT则存储整体
3.GIT不需联网先存储在本地,降低风险
4.GIT内容完整性要优于SVN
*发散比较(如果项目使用SVN集中管理,服务器需要特别稳定所以需要使用负载均衡,都知道负载均衡的费用成本和风险比较高 ,如果使用GIT的话就可以去中心化,可以避免上诉的问题)
GIT配置
GIT配置参数是根据三级层次优先级查找的,如果存在相同配置参数的话,首先根据 ①系统层用户下 .get/config ②当前用户目录 /.gitconfig ③git安装目录 /etc/gitconfig
git connfig --list 查看所有配置
git config user.name 查看配置值
git config [–local|–global|–system] –add section.key value 在某个环境添加一个配置
git config [–local|–global|–system] –unset section.key 删除某项配置
创建版本库
初始化一个Git仓库,使用git init命令
添加文件到Git仓库,分两步:
1.使用命令git add <file>,可反复多次使用,以添加多个文件
2.使用命令git commit -m <message>,完成
* 至于为什么需要先add 在commit 分两步执行看下面:
图1-1从左到右代表git提交到文件库的过程:
git add 提交到缓存库
git add. 将所有的add和update都提交至缓存库
git add -a 将add、update、delete都提交至缓存库
git commit 提交至文件库 简写:git -m "aaa"
git -am "aaa" 是上面两个命令的简写 ,会同时将修改放入缓存和文件库
GIT三类文件
1.被追踪的(tracked):已经加入文档库
2.未被追踪的(untrcked): 没有加入过文档库
3.忽略的(ignore):忽略那些不需要跟踪的文件,对当前目录及子目录生效,所有在主目录新建就好 .git文件同理
* 假如新建一个.gitignore 文件未及时生效?因为文件已经纳入到缓存库,需要
git rm -r --cache . 删除全部缓存
git add -am "add new file .ingore" 提交忽略文件修改至文件库
查看log
git log 查看日志
git log --oneline 查看简写日志
git log --oneline --graph 查看带分支的简写日志
git log --abbrev-commit 查看log简写指令日志,指令是为你的SHA-1值生成出简短且唯一的缩写
修改与回退
1.版本回退
a.HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
b.穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本
c.要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
commit_id commit_log
89JKI9 append GPL 1️⃣
HEAD =====> JKIU78 wrout hvb 2️⃣ 从2-3时git
LFTR78 init starting 3️⃣
d.现在目前HEAD在 2️⃣
假如要 2->3要
git reset --hard LFTR78 退回代码至LFTR78
假如要 2->1要
git reflog --oneline --graph 查看完整的提交日志(包括历史日志)
git reset --hard commit_id 回退至commit_id节点代码
2.删除文件与恢复
a.如果要删除,执行 git rm <file>、git commit -m "remove test.txt"即可
b.如果删除出错、需要恢复执行git checkout <file>
* git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
3.git reset 三种模式 hard、soft、mixed
看图1-1后半部分就可以清楚的分辨出他们的不同
reset --hard id:重置stage区和工作目录,重置到你规定的提交点
reset --soft id:保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区
reset 不加参数(mixed)/ reset --mixed id :保留工作目录,并清空暂存区
使用场景:
--hard:
1. git reset --hard HEAD 抛弃所有add、commit以及本地修改,保持本地清洁
2. git reset --hard id 抛弃id之后的所有提交
--soft:
1. 利用会保留回退和修改至暂存区,可以合并多个commit节点,清洁提交点
--mixed(默认):
1. 与上面--soft合并commit节点差不多,只是多了git add添加到暂存区的操作
2. git reset HEAD移除所有add、commit的提交至本地仓库。
4.git reset 、git revert 可能会有很多人不知道如何选择
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 - 8p8675 - 78ju09 - 89pl76[master]
\ /
76cada - 62ecb3 - b886a0 [feature]
他们的区别我们用例子演示一下就能明白:
假如当前master分支 78ju09 commit节点发现了提交的代码bug
1.如果想要保存住 89pl76 提交点的代码我们会使用revert命令操作,他会在 89pl76 之后新生成一个提交,对应着 78ju09 节点代码的反向操作(比如你加了一个A,此时就会去掉这个A还原代码)
2.如果不想保存 89pl76 的代码,我们就可以使用reset 来操作,就是讲指定节点的代码全部回退至本地或者缓存库 详细命令介绍 看上面git reset三种模式!
所以综上所诉:
git reset 78ju09 就是回退78ju09之后的所有代码至本地,并且将HARD指针指向78ju09这个节点 查看git log就会发现最新log是 8p8675
git revert 78ju09 会生成一个新的 commit,将指定的 78ju09 内容从当前分支上撤除,对78ju09之后的节点不会有任何影响
git revert 的常规用法:
1.回退78ju09代码
git revert 78ju09
2.回退8p8675代码(这是一个merge commit 需要指定-m 1)
git show 8p8675
commit 8p8675u8797g77908080807hjkhjh798
merge 5a6057 b886a0
git revert -m 1 8p8675 (此时8p8675有两个父级节点,5a605->1 master b886a0-> 2 feature)
远端仓库
1.添加远程库
a. 关联一个远程库 git remote add origin/upstream <gitpath>
b. git push -u origin <branch> 第一次推送本地分支的所有内容至origin分支,-u参数是将<branch>关联起来,简化以后提交
c. 此后每次本地提交后,仅 git push origin master推送最新修改即可
2.克隆仓库
a. git clone 克隆一个仓库到本地 默认使用ssh协议,https很慢还需要验证账号密码、但某些公司需要使用https
3.Gitlab和Github贡献代码
平时项目开发使用gitlab和github比较多,一般更新操作流程介绍:
a.首先登录gitlab fork指定的项目
b.git clone <path> 克隆项目代码
c.git remote add upstream <path> 关联至upstream远端分支
d.git fetch upstream 从upstream更新最新的代码
e.git checkout -b abc upstream/abc 基于upstream/abc分支新建分支并切换至该abc分支
f.本地开发修改
g.git commit -am "commit log" 提交更新至本地文件库
h.[当多个人合作在同一分支上开发提交] git pull --rebase upstream abc
i.git push origin abc 提交至远程origin分支abc
j.在gitlab上merage request之后,提醒developer去合并代码
h.再次在提交代码时如果分支使用的特别频繁你的origin 和 upstream 肯定不是一致的,需要将origin的分支删除更新至最新 : 操作如下->
1.git checkout master
2.git branch -D abc
3.git push origin :abc
4.git fetch upstream
然后在从e步骤开始即可!!!
分支管理
1.创建与合并
查看分支 git branch
创建分支 git branch <name>
切换分支 git checkout <name>
创建并切换分支 git checkout -b <name>
合并某分支到当前分支 git merge <name>
删除分支 git branch -d <name>
删除origin远端remit分支 git push origin :remit
查看分支合并图 git log --graph --pretty=oneline --abbrev-commit
2.分支合并策略
git merge 使用的是fast forward策略,看不出提交信息
git merge --no-ff -m "merge with no-ff" dev 加上--no--ff参数可以使用简单模式合并,因为会产生信息所以添加-m,能从历史信息中追溯到
3.储存区
git stash save 'test-ldc-bug' 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit
git stash list 多次使用’git stash’命令后,你的栈里将充满了未提交的代码 查看多个暂存代码版本,查看所有的缓存记录
git stash apply stash@{1} 恢复到指定@{1}版本的代码,并保留记录
git stash drop stash@{1} 删除某一次缓存
git stash clear 清理暂存的栈,清楚所有的缓存记录
git stash pop 继续原来的工作,删除记录
git stash show -p 查看指定stash的全部diff
5.rebase变基
git rebase 简单就是会隐藏合并的过程
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
*当在版本后面发现AM时代表正在变基中,使用如下代码可以清空正在变基的状态.
rm -rf .git/rebase-apply
标签tag
git tag <tagname> 基于当前分支最新提交创建标签
git tag -a "tagname" -m "create tag v1.0" commit_id a指定标签名称 m标签内容 commit_id提交的ID
git tag 查看所有标签
git push origin <tagname> 推送一个本地标签到远程
git push origin --tags可以推送所有本地标签
git tag -d <tagname> 删除本地标签
git push origin :refs/tags/<tagname> 删除远程标签
git cherry-pick 介绍
将一个分支上的某些commit在另一个主分支上重演
1.git cherry-pick
20c2f506d789bb9f041050dc2c1e954fa3fb6910
2633961a16b0dda7b767b9264662223a2874dfa9
5d5929eafd1b03fd4e7b6aa15a6c571fbcb3ceb4
a.多个commit-hash使用空格分割, commit-hash最好按提交时间先后排列, 即最先提交的commit放在前面.
假设分支结构如下:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master] ---HEAD
\
76cada - 62ecb3 - b886a0 [feature]
再假设 62ecb3 的提交修复了bug,这时候可以用cherry pick 合并单个 commit
-> git cherry-pick 62ecb3
就这么简单,62ecb3 已经应用在 master 的log上了(作为一个新的commit)
git diff/patch 介绍
1.patch 和diff 的区别
Git 提供了两种补丁方案,一是用git diff生成的UNIX标准补丁.diff文件,二是git format-patch生成的Git专用.patch 文件。
.diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以合并成一个diff文件。
.patch文件带有记录文件改变的内容,也带有commit记录信息,每个commit对应一个patch文件。
在Git下,我们可以使用.diff文件也可以使用.patch 文件来打补丁,主要应用场景有:CodeReview、代码迁移等。
2.创建diff/patch
git format-patch 2a2fb4 -2 --n指从sha1 id对应的commit开始算起n个提交
git format-patch 2a2fb4 -1 --某个提交的patch
git format-patch 2a2fb4 .. 89aebf --某两次提交之间的所有patch
git diff 2a2fb4 89aebf > patch.diff --创建两次提交之间的差异内容至diff文件
3.应用patch 和 diff
检查patch/diff是否能正常打入:
git apply --check 【path/to/xxx.patch】
git apply --check 【path/to/xxx.diff】
打入patch/diff:
git apply 【path/to/xxx.patch】
git apply 【path/to/xxx.diff】
git am 【path/to/xxx.patch】
4.冲突解决
在打补丁过程中有时候会出现冲突的情况,有冲突时会打入失败:
此时需要解决冲突:
1、首先使用以下命令行,自动合入 patch 中不冲突的代码改动,同时保留冲突的部分,同时会生成后缀为 .rej 的文件,保存没有合并进去的部分的内容,可以参考这个进行冲突解决
git apply --reject xxxx.patch
2、解决完冲突后删除后缀为 .rej 的文件,并执行git add.添加改动到暂存区
3、接着执行git am --resolved 或者 git am --continue
说明:在打入patch冲突时,可以执行git am --skip跳过此次冲突,也可以执行git am --abort回退打入patch的动作,还原到操作前的状态
网友评论