Git笔记归档
1.快捷别名
1 | `st`就表示`status` |
如图:
2.时光机穿梭
2.1.版本回退
要随时掌控工作区状态,使用git status
命令
如果有文件被修改过用git diff
可以查看修改内容
HEAD
指向的版本就是当前版本,使用命令git reset --hard commit_id
id号一般是前七位
回退用git log
查看提交历史
前滚用git reflog
查看命令历史
2.2.工作区和暂缓区
Git管理的文件分为:工作区,版本库,版本库又分为暂存区stage和暂存区分支master(仓库)
工作区>>>>暂存区>>>>仓库
git add .
把文件从工作区>>>>暂存区,git commit
把文件从暂存区>>>>仓库,
git diff
查看工作区和暂存区差异,
git diff --cached
查看暂存区和仓库差异,
git diff HEAD -- name
查看工作区和仓库的差异,
git add
的反向命令git checkout
,撤销工作区修改,即把暂存区最新版本转移到工作区,
git commit
的反向命令git reset HEAD name
,就是把仓库最新版本转移到暂存区。
2.3.管理修改
必须git add
到暂缓区,才能git commit -m ‘xxx’
到仓库
2.4.撤销修改
1.没有git add
时,用git checkout -- file
2.已经git add
时,先git reset HEAD <file>
回退到1.,再按1.操作
3.已经git commit
时,用git reset
回退版本
从暂存区恢复工作区,
git resotre --worktree readme.txt
从master恢复暂存区
git restore --staged readme.txt
从master同时恢复工作区和暂存区
warning :LF will be replaced by CRLF in sssgit restore --source=HEAD --staged --worktree readme.txt
==checkout=restore==
2.5.删除文件
1.如果你用的rm删除文件,那就相当于只删除了工作区的文件,如果想要恢复,直接用git checkout -- <file>
就可以了
2.如果你用的是git rm
删除文件,那就相当于不仅删除了文件,而且还添加到了暂存区,需要先git reset HEAD <file>
,然后再git checkout -- <file>
3.如果你想彻底把版本库的删除掉,先git rm
,再git commit
就可以了
2.5.1.不存在不能恢复 除非把版本记录打乱
git rm file
并且git commit
并不是删除了版本库里的某个版本号,而是对工作目录下的删除操作进行了一个记录,会在仓库里生成一个新的版本号,在该版本下没有该文件。但是可以用git reset --hard commit_id
进行版本回退,回退到有这个文件的版本号。而git checkout commit_id file
命令是从含有该文件的旧版本号里把该文件拿出来,放到现版本里,版本号不改变。
3.远程仓库
3.1.添加到远程库
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改
若出现==fatal: not a git repository (or any of the parent directories): .git==
先输入:
git init
出现Initialized empty Git repository in C:/Users/name/.git/
再重新连接远程库:git remote add origin git@https://github.com/xxx/xxx.git
即可添加
3.2.从远程库克隆
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone name
命令克隆
Git支持多种协议,包括https
,但ssh
协议速度最快
4.分支管理
4.1.创建与合并分支
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
或者git switch <name>
创建+切换分支:git checkout -b <name>
或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
4.2.解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交
用git log --graph
命令可以看到分支合并图
4.3.分支管理策略
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了
所以,团队合作的分支看起来就像这样:
合并分支时,加上--no-ff
参数就可以用普通模式合并例如git merge --no-ff -m "xxx" dev
,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并
4.4.BUG分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
用git stash list
命令查看stash
内容
另一种方式是用git stash pop
,恢复的同时把stash内容也删了:
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick commit_id
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
4.5.Feature分支
开发一个新feature,最好新建一个分支
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除
4.6.多人协助
- 查看远程库信息,使用
git remote -v
- 本地新建的分支如果不推送到远程,对其他人就是不可见的
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交 - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致 - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
- 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突
4.7.Rebase
git rebase
操作可以把本地未push的分叉提交历史整理成==直线==
rebase
的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
5.标签管理
5.1.创建标签
- 命令
git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id - 命令
git tag -a <tagname> -m "blablabla..."
可以指定标签信息 - 命令
git tag
可以查看所有标签
==注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签==
5.2.操作标签
命令
git push origin <tagname>
可以推送一个本地标签命令
git push origin --tags
可以推送全部未推送过的本地标签如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
命令
git tag -d <tagname>
可以删除一个本地标签命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签
==refs=reference(参考)==
5.3.使用GitHub
如何参与一个开源项目呢?比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页https://github.com/twbs/bootstrap ,点Fork
就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:
git clone git@github.com:xxx/xxx.git
一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址git@github.com:twbs/bootstrap.git
克隆,==因为没有权限==,你将不能推送修改,原理如下:
1 | ┌─ GitHub ────────────────────────────────────┐ |
可以推送pull request
给官方仓库来贡献代码
6.使用Gitee
如果在使用命令git remote add
时报错:==fatal: remote origin already exists==
这说明本地库已经关联了一个名叫origin
的远程库,此时,可以先用git remote -v
查看远程库信息
如果有多个远程库,我们需要用不同的名称来标识不同的远程库。
仍然以xxx
本地库为例,我们先删除已关联的名为origin
的远程库:
git remote rm origin
然后,先关联GitHub的远程库:
git remote add github git@github.com:xxx/xxx.git
==注意,远程库的名称叫github,不叫origin了。==
接着,再关联Gitee的远程库:
git remote add gitee git@gitee.com:xxx/xxx.git
==同样注意,远程库的名称叫gitee,不叫origin。==
现在,我们用git remote -v
查看远程库信息,可以看到两个远程库
如果要推送到GitHub,使用命令:
git push github master
如果要推送到Gitee,使用命令:
git push gitee master
7.自定义Git
可以Git不同的主题
7.1.忽略特殊文件
8.配置别名
8.1.配置文件
配置Git的时候,加上--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config
文件中:
1 | cat .git/config |
别名就在[alias]
后面,要删除别名,直接把对应的行删掉即可。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig
中:
1 | cat .gitconfig |
配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。