You are on page 1of 12

Git

创建版本库
创建版本库: git init
文件添加到暂存区: git add readme.txt
文件添加到版本库: git commit -m "wrote a readme file"

时光穿梭机
查看修改状态: git status
查看文件差异: git diff filename
查看工作区和版本库里面最新版本的区别: git diff HEAD -- readme.txt

Tip ​

HEAD 代表最新的一个版本

版本回退

查看历史记录: git log


参数: --pretty=oneline 简化显示内容
版本回退: git reset --hard HEAD^
^ 代表上个版本,^^ 代表上上个版本,~100 往上100个版本
指定回到未来的某个版本: git reset --hard 1094a ,版本号写前几位
前提:未关闭命令行窗口
若已关闭,此命令可查看每一次命令 : git reflog

撤销修改

撤销工作区的修改: git checkout -- file


撤销暂存区的修改,重新放回工作区: git reset HEAD <file>

Note ​

总结

1.没有 git add 时,用 git checkout -- file

2.已经 git add 时,先 git reset HEAD <file> 撤销回工作区,再按1操作


3.已经 git commit 时,用 git reset 回退版本

4.推送到远程库,GG

文件删除

文件删除
手动或者用 rm 命令删除, git status 命令会立刻告诉你哪些文件被删除

Tip

小提示:

git rm <file> 就是删文件,并且把删文件的修改提交到暂存区

和手动( rm )删除文件,然后使用 git add<file> 效果是一样的。

从版本库删除
用命令 git rm 删掉,并且 git commit ,文件就从版本库中被删除了

恢复文件

如果手动或 rm 删除,未执行 add 提交到暂存区

- git checkout -- <file>


如果使用 git rm 删除,或者手动 rm 删除,执行了 add 操作
1. git reset HEAD <file>
2. git checkout -- <file>
git rm 删掉,并且 git commit 后
git reset --hard 版本号
远程仓库
1. 创建SSH Key
ssh-keygen -t rsa -C "youremail@example.com"
2. Gitee中添加Key
3. 创建远程库
4. 关联远程库
git remote add origin [git@gitee.com]
(mailto:git@gitee.com):micmco/gitlearn.git
5. 所有内容推送到远程库
git push -u origin master
-u 本地的 master 分支内容推送到远程新的 master 分支,并关联起来
查看远程仓库链接: git remote -v

Github SSH改Token登录

Tip ​

问题:Github git pull

fatal: unable to access ' https://github.com/likemuuxi/learngit.git/': SSL certificate


problem: unable to get local issuer certificate

解决办法:

git config --global http.sslVerify false

删除远程库

如果添加的时候地址写错了,或者就是想删除远程库,可以用 git remote rm <name> 命令。


使用前,建议先用 git remote -v 查看远程库信息

然后,根据名字删除,比如删除 origin :
$ git remote rm origin

此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身
并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删
除。‘

推送修改

git push origin master

从远程库克隆

git clone git@github.com:likemuuxi/learngit.git

分支管理
创建并切换dev分支: git checkout -b dev
-b 参数表示创建并切换,相当于以下两条命令
git branch dev
git checkout dev
查看当前分支: git branch
git branch 命令会列出所有分支,当前分支前面会标一个 * 号
切换回 master 分支: git checkout master
dev 分支合并到 master 分支: git merge dev
删除 dev 分支: git branch -d dev

switch

创建并切换到新的 dev 分支: git switch -c dev


直接切换到已有的 master 分支: git switch master

总结

功能 命令
查看分支 git branch

创建分支 git branch <name>

切换分支 或者git switch <name>


git checkout <name>

创建+切换分支 git checkout -b <name>或者git switch -c <name>

合并某分支到当前分支 git merge <name>

删除分支 git branch -d <name>

注意

切换到其他分支新建文件不进行 add 和 commit ,切换回主线后(旧版本无法跳转)仍然可以


看到新建的文件和修改的内容,对于所有分支而言, 工作区和暂存区是公共的。
如果在其他分支仅 add ,并未 commit ,可以切换到 master 分支去 commit ,切换的时候会出
现如下提示,这样会导致混乱,不建议。

Switched to branch 'master'


A test1.txt

建议:

1. 跳转分支之前 git status 一下查看是不是有没有add和commit的工作,如果有,可以的


话,就都提交掉。
2. 如果确实有尚未add和commit的工作,但是并未完成不方便进行提交,可以利用git
stash进行现场保留,然后跳转。
3. 不做任何修改直接再跳回去,然后进行1或2步中所说。

解决冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用 git log --graph 命令可以看到分支合并图。

用带参数的 git log 也可以看到分支的合并情况:


git log --graph --pretty=oneline --abbrev-commit

用 , ,
Git `<<<<<<<` `=======` `>>>>>>>` 标记出不同分支的内容
合并操作( merge )只对对当前所在分支产生影响;无论是否存在冲突,合并之后,feature
分支都不会发生变化。

分支管理策略

合并分支时,加上 --no-ff 参数就可以用普通模式合并,禁用 Fast forward ,合并后的历史


有分支,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并。

示例:

git merge --no-ff -m "merge with no-ff" dev

因为本次合并要创建一个新的commit,所以加上 -m 参数,把commit描述写进去。合并后,
我们用 git log --graph 看看分支历史

分支策略

首先, master 分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干


活;
你和你的小伙伴们每个人都在 dev 分支上干活,每个人都有自己的分支,时不时地往
dev 分支上合并就可以了
到某个时候,比如1.0版本发布时,再把 dev 分支合并到 master 上,在 master 分支发布
1.0版本;

Bug分支

修复Bug
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除临时分支;

修复完继续工作
当手头工作没有完成时,先把工作现场 git stash 一下,然后去修复bug,修复后,再 git
stash pop ,回到工作现场;

切换回原工作分支: git switch dev


查看原工作存储位置: git stash list
恢复: git stash apply
删除stash: git stash drop
恢复并删除: git stash pop

在dev分支上修复同样的bug

在master分支上修复的bug,想要合并到当前dev分支,可以用 git cherry-pick <commit>


命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

cherry-pick 命令,让我们能复制一个特定的提交到当前分支

git cherry-pick 4c805e2

Git自动给dev分支做了一次提交,这两个commit只是改动相同,但是两个不同的commit。

Question ​

在dev分支上可以“重放”这个修复过程,那么直接在dev分支上修复bug,然后在master分
支上“重放”行不行?

当然可以,不过你仍然需要 git stash 命令保存现场,才能从dev分支切换到master分支。

Feature分支

开发一个新feature,最好新建一个分支;

如果要丢弃一个没有被合并过的分支,可以通过 git branch -D <name> 强行删除。

多人协作

查看远程库的信息,用 git remote ,用 git remote -v 显示更详细的信息

多人协作的工作模式通常是这样:

1. 首先,可以试图用 git push origin <branch-name> 推送自己的修改;


2. 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull 试图合并;
3. 如果合并有冲突,则解决冲突,并在本地提交;
4. 没有冲突或者解决掉冲突后,再用 git push origin <branch-name> 推送就能成功!

如果 git pull 提示 no tracking information ,则说明本地分支和远程分支的链接关系没


有创建,用命令 git branch --set-upstream-to <branch-name> origin/<branch-
name> 。

推送分支

推送时,要指定本地分支: git push origin dev


哪些分支需要推送,哪些不需要呢?

master 分支是主分支,因此要时刻与远程同步;
dev 分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复
了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

抓取分支

git clone git@github.com:michaelliao/learngit.git

Rebase

rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对
比。

标签

创建标签

命令 git tag <tagname> 用于新建一个标签,默认为 HEAD ,也可以指定一个commit


id;
命令 git tag -a <tagname> -m "blablabla..." 可以指定标签信息;
命令 git tag 可以查看所有标签。
命令 git show <tagname> 查看标签信息

注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分
支,那么在这两个分支上都可以看到这个标签。

操作标签

命令 git push origin <tagname> 可以推送一个本地标签;


命令 git push origin --tags 可以推送全部未推送过的本地标签;
命令 git tag -d <tagname> 可以删除一个本地标签;
命令 git push origin :refs/tags/<tagname> 可以删除一个远程标签。

版本回退原理
回退版本的时候,Git仅仅是把HEAD从指向 append GPL :

┌────┐
│HEAD│
└────┘

└──▶ ○ append GPL

○ add distributed

○ wrote a readme file

改为指向 add distributed :

┌────┐
│HEAD│
└────┘

│ ○ append GPL
│ │
└──▶ ○ add distributed

○ wrote a readme file

然后顺便把工作区的文件更新了。

工作区和暂存区

git add 命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行 git


commit 就可以一次性把暂存区的所有修改提交到分支

管理修改
第一次修改 -> git add -> 第二次修改 -> git commit
第二次修改并没有放入暂存区, git commit 只负责把暂存区的修改提交了,也就是第一次的
修改被提交了,第二次的修改不会被提交。
那怎么提交第二次修改呢?
第一次修改 -> git add -> 第二次修改 -> git add -> git commit

问题
Note ​

问题:

git提示“warning: LF will be replaced by CRLF”

原因:

Windows 系统上,把它设置成 true,这样在检出代码时,换行会被转换成回车和换行

解决办法

#提交时转换为LF,检出时转换为CRLF
$ git config --global core.autocrlf true

操作汇总

git init # 初始化本地git仓


库(创建新仓库)
git config --global user.name "xxx" # 配置用户名
git config --global user.email "xxx@xxx.com" # 配置邮件
git config --global color.ui true # git status等命
令自动着色
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
git config --global --unset http.proxy # remove proxy
configuration on git
git clone git+ssh://git@192.168.53.168/VT.git 远程仓库
# clone
git status # 查看当前版本状态
(是否修改)
git add xyz # 添加xyz文件至
index
git add . # 增加当前子目录下
所有更改过的文件至index
git commit -m 'xxx' # 提交
git commit --amend -m 'xxx' # 合并上一次提交
(用于反复修改)
git commit -am 'xxx' # 将add和commit合
为一步
git rm xxx # 删除index中的文

git rm -r * # 递归删除
git log # 显示提交日志
git log -1 # 显示1行日志 -n为

n
git log -5
git log --stat # 显示提交日志及相
关变动文件
git log -p -m
git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详
细内容
git show dfb02 # 可只用commitid
的前几位
git show HEAD # 显示HEAD提交日志
git show HEAD^ # 显示HEAD的父(上
一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本
git tag # 显示已存在的tag
git tag -a v2.0 -m 'xxx' # 增加v2.0的tag
git show v2.0 # 显示v2.0的日志及
详细内容
git log v2.0 # 显示v2.0的日志
git diff # 显示所有未添加至
index的变更
git diff --cached # 显示所有已添加
index但还未commit的变更
git diff HEAD^ # 比较与上一个版本
的差异
git diff HEAD -- ./lib # 比较与HEAD版本
lib目录的差异
git diff origin/master..master # 比较远程分支
master上有本地分支master上没有的
git diff origin/master..master --stat # 只显示差异的文
件,不显示具体内容
git remote add origin git+ssh://git@192.168.53.168/VT.git # 增加远程定义(用
于push/pull/fetch)
git branch # 显示本地分支
git branch --contains 50089 # 显示包含提交
50089的分支
git branch -a # 显示所有分支
git branch -r # 显示所有原创分支
git branch --merged # 显示所有已合并到
当前分支的分支
git branch --no-merged # 显示所有未合并到
当前分支的分支
git branch -m master master_copy # 本地分支改名
git checkout -b master_copy # 从当前分支创建新
分支master_copy并检出
git checkout -b master master_copy # 上面的完整版
git checkout features/performance # 检出已存在的
features/performance分支
git checkout --track hotfixes/BJVEP933 # 检出远程分支
hotfixes/BJVEP933并创建本地跟踪分支
git checkout v2.0 # 检出版本v2.0
git checkout -b devel origin/develop # 从远程分支
develop创建新本地分支 并检出 devel
git checkout -- README # 检出head版本的
README文件(可用于修改错误回退)
git merge origin/master # 合并远程master
分支至当前分支
git cherry-pick ff44785404a8e # 合并提交
ff44785404a8e的修改
git push origin master # 将当前分支push到
远程master分支
git push origin :hotfixes/BJVEP933 # 删除远程仓库的
hotfixes/BJVEP933分支
git push --tags # 把所有tag推送到
远程仓库
git fetch # 获取所有远程分支
(不更新本地分支,另需merge)
git fetch --prune # 获取所有原创分支
并清除服务器上已删掉的分支
git pull origin master # 获取远程分支
master并merge到当前分支
git mv README README2 # 重命名文件
README为README2
git reset --hard HEAD # 将当前版本重置为
HEAD(通常用于merge失败回退)
git rebase
git branch -d hotfixes/BJVEP933 # 删除分支
hotfixes/BJVEP933 (本分支修改已合并到其他分支)
git branch -D hotfixes/BJVEP933 # 强制删除分支
hotfixes/BJVEP933
git ls-files # 列出git index包
含的文件
git show-branch # 图示当前分支历史
git show-branch --all # 图示所有分支历史
git whatchanged # 显示提交历史对应
的文件修改
git revert dfb02e6e4f2f7b573337763e5c0013802e392818 # 撤销提交
dfb02e6e4f2f7b573337763e5c0013802e392818
git ls-tree HEAD # 内部命令:显示某
个git对象
git rev-parse v2.0 # 内部命令:显示某
个ref对于的SHA1 HASH
git reflog # 显示所有提交,包
括孤立节点
git show HEAD@{5}
git show master@{yesterday} # 显示master分支
昨天的状态
git log --pretty=format:'%h %s' --graph # 图示提交日志
git show HEAD~3
git show -s --pretty=raw 2be7fcb476
git stash # 暂存当前修改,将
所有至为HEAD状态
git stash list # 查看所有暂存
git stash show -p stash@{0} # 参考第一次暂存
git stash apply stash@{0} # 应用第一次暂存
git grep "delete from" # 文件中搜索文本
“delete from”
git grep -e '#define' --and -e SORT_DIRENT
git gc
git fsck

You might also like