Git笔记归档

1.快捷别名

1
2
3
4
5
6
7
8
9
10
11
12
13
`st`就表示`status`

`co`表示`checkout`

`ci`表示`commit`

`br`表示`branch`

`aborting commit dur to emptu commit message unstage name`表示`git reset HEAD name`

`git last`表示`git config --global alias.last 'log -1'`显示最近一次的提交

`git lg`表示`git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"`

如图:

2.时光机穿梭

2.1.版本回退

要随时掌控工作区状态,使用git status命令

如果有文件被修改过用git diff可以查看修改内容

HEAD指向的版本就是当前版本,使用命令git reset --hard commit_idid号一般是前七位

回退用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
2
3
4
5
6
7
8
9
10
11
┌─ GitHub ────────────────────────────────────┐
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ twbs/bootstrap │────>│ my/bootstrap │ │
│ └─────────────────┘ └─────────────────┘ │
│ ▲ │
└──────────────────────────────────┼──────────┘

┌─────────────────┐
│ local/bootstrap │
└─────────────────┘

可以推送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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ cat .git/config 
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log -1

别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。

而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:

1
2
3
4
5
6
7
8
9
$ cat .gitconfig
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = your@email.com

配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。

9.搭建Git服务器

10.常用命令总结

11.尾巴