前言
1、初始化
用户
$ git config --global user.email "your email"
$ git config --global user.name "your name"
2、秘钥
- 查看是否存在秘钥
$ ls -al ~/.ssh
id_rsa 是私钥,id_rsa.pub 是公钥
id_rsa.pub 是你需要上传到 github 的 SSH KEY
- 生成秘钥
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
3、本地库和远程库
- 已创建有远程库,未创建本地库
$ git clone "your repo"
- 已创建本地库,未创建远程库
新建文件夹
$ mkdir test
初始化 git
$ git init
移除原有的 origin
$ git remote rm origin
添加你的远程库(SSH地址)
$ git remote add origin "your remote repo"
更新本地库
$ git pull
首次推送与远程库建立关联,以后直接 git push 就可以
$ git push --set-upstream origin master
4、分支操作
查看、新建、切换、删除分支
查看当前所在分支
$ git branch
查看所有分支
$ git branch -a
查看远程库信息
$ git remote -v
新建分支
$ git branch "new branch"
切换分支
$ git checkout "target branch"
新建并切换到新分支
$ git checkout -b "new branch"
新建分支并和远程分支进行关联
$ git checkout -b "new branch" origin/"new branch"
合并分支到当前所处分支上
$ git merge "your branch"
删除分支
$ git branch -d "your branch"
强制删除未 commit 的分支
$ git branch -D "your branch"
5、正常流程
查看当前工作区状态
$ git status
添加单个文件到暂存区
$ git add xxx.txt
一次性添加所有改动文件
$ git add .
提交文件到本地版本库
$ git commit -m "I add a file."
推送本地更新到远程版本库
$ git push
本地库关联远程库
$ git push --set-upstream origin master
6、对比文件
工作区和暂存区之间差异对比
$ git diff "xxx.txt"
暂存区和版本库之间差异对比
$ git diff --cached(--staged) "xxx.txt"
工作区和版本库之间差异对比
$ git diff master
7、查看历史提交记录
$ git log
8、版本回退
HEAD
是最新版本,HEAD^
是上一个版本
$ git reset --hard HEAD^
回退到指定id,git log 查看版本id,版本id不用全部输入,取头几位就可以
$ git reset --hard cb926e7e
9、撤销工作区修改
使用版本库中的文件或者暂存区中的文件替换工作区的文件让文件回到最近一次 git commit 或 git add 时的状态
$ git checkout -- "xxx.txt"
10、删除文件
删除工作区中的文件
$ rm "xxx.txt"
提交删除操作到暂存区
$ git rm "xxx.txt"
提交删除到版本库,在版本库中彻底删除文件
$ git commit -m "remove file"
11、分支管理策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活
developer分支用来干活,也就是说,developer分支是不稳定的,到某个时候,比如1.0版本发布时,再把developer分支合并到master上,在master分支发布1.0版本
你和你的小伙伴们每个人都在developer分支上干活,每个人都有自己的分支,时不时地往developer分支上合并就可以了所以,团队合作的分支看起来就像这样
12、储藏工作现场
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场
储存工作现场
$ git stash
工作现场列表
$ git stash list
恢复但不删除储藏栈的工作现场
$ git stash apply
恢复并删除储藏栈中的工作现场
$ git stash pop
13、多人协作工作模式
试图用git push origin branch-name推送自己的修改,如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并,如果合并有冲突,则解决冲突,并在本地提交没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功
14、创建 .gitignore
在 git 工作区根目录下创建 .gitignore 文件,把要忽略的文件名写进去,git 就会自动忽略这些文件
15、创建别名
给 status 创建别名 st
$ git config --global alias.st status
16、git 配置文件
配置文件放在 ~/.gitconfig
17、git fetch 和 git pull 区别
要讲清楚这两个命令的区别,就需要从git clone开始讲起
假设你在github上有一个远程仓库地址是xxx,然后你从远程仓库clone到本地仓库
$ git clone xxx
执行完此命令后:
Git会自动为你将远程仓库命名为origin,并下载其中所有的数据到本地;
在本地建立所有远程存在的分支,并且命名为origin/xxx,例如远程分支有master、developer,那么本地就会建立origin/master分支、origin/developer分支,并且它们都是处于remotes目录下,是隐藏的。使用命令git branch -a就可以看到隐藏目录remotes,结果显示为remotes/origin/master以及remotes/origin/developer。
接着,Git会继续建立一个属于你的本地master和developer分支,位置和远程origin/master、origin/developer分支处于相同的位置,你就可以开始工作了。这样,我们在本地仓库的本地分支和远程分支就都有了,并且始于同一位置。
如果其他人向github上xxx分支推送了他们的更新,那么服务器上的相应分支就会向前推进。如果在本地的相应分支进行了commit提交到本地代码库,那么本地的master或者developer分支也会向前推进,不过只要你不和服务器通信数据,那么本地的remotes/origin/master(developer)指针仍然会在原地不动。
$ git fetch origin
运行git fetch origin命令后,会同步远程服务器上的数据到本地;该命令首先找到origin是哪个服务器,从上面获取你未曾拥有的数据,更新到你的本地remotes/origin/master(developer),然后把remotes/origin/master(developer)的指针移动到最新的位置上:
比较本地 master 分支和 origin/master 分支有什么区别
$ git log master..origin/master
切换到本地 master 分支下
$ git checkout master
合并 origin/master 分支到本地 master 分支
$ git merge origin master
git pull 相当于 git fetch origin 和 git merge
git fetch 相当于先将服务器上的 origin 分支更新到本地 remotes/origin 分支上,然后手动去 merge 合并 origin 分支到本地分支上
这就是 git pull 和 git fetch 的区别
18、git 删除未跟踪文件
删除未跟踪文件
$ git clean -f
删除未跟踪文件目录
$ git clean -fd
- 正式删除文件以前先查看哪些会被删除
$ git clean -nf
$ git clean -nfd
19、在本地删除远程已经没有的分支
$ git fetch -p origin
20、重命名本地分支
$ git branch -m old-local-branch-name new-local-branch-name
21、删除远程分支
$ git push origin :old-remote-branch-name
22、本地分支与远程分支建立关联(远程分支不存在也可以)
切换到本地分支
$ git checkout local-branch
push 到想要建立关联的远程分支
$ git push -u origin/remote-branch
23、重新跟踪远程文件
先删除远程文件
$ git remote rm origin
跟踪新远程文件
$ git remote add origin https://xxx.git
或者合并成一条命令
$ git remote origin set-url https://xxx.git
24、tag 标签使用
什么是tag
tag是git版本库的一个标记,指向某个commit的指针。
tag主要用于发布版本的管理,一个版本发布之后,我们可以为git打上 v.1.0.1 v.1.0.2 …这样的标签。
tag感觉跟branch有点相似,但是本质上和分工上是不同的:
tag 对应某次commit, 是一个点,是不可移动的。
branch 对应一系列commit,是很多点连成的一根线,有一个HEAD 指针,是可以依靠 HEAD 指针移动的。
所以,两者的区别决定了使用方式,改动代码用 branch ,不改动只查看用 tag。
tag 和 branch 的相互配合使用,有时候起到非常方便的效果,例如:已经发布了 v1.0 v2.0 v3.0 三个版本,这个时候,我突然想不改现有代码的前提下,在 v2.0 的基础上加个新功能,作为 v4.0 发布。就可以检出 v2.0 的代码作为一个 branch ,然后作为开发分支。
tag的简单使用
- 创建tag:
创建 tag 是基于本地分支的 commit,而且与分支的推送是两回事,就是说分支已经推送到远程了,但是你的 tag 并没有,如果把 tag 推送到远程分支上,需要另外执行 tag 的推送命令。
git tag <tagName> //创建本地tag
git push origin <tagName> //推送到远程仓库
若存在很多未推送的本地标签,你想一次全部推送的话:
git push origin --tags
以上是基于本地当前分支的最后的一个commit 创建的 tag ,但是如果不想以最后一个,只想以某一个特定的提交为tag ,也是可以的,只要你知道commit 的id。
git log --pretty=oneline //查看当前分支的提交历史 里面包含 commit id
git tag -a <tagName> <commitId>
- 查看标签
查看本地某个 tag 的详细信息:
git show <tagName>
查看本地所有 tag:
git tag 或者 git tag -l
查看远程所有 tag:
git ls-remote --tags origin
- 删除标签
本地 tag 的删除:
git tag -d <tagName>
远程 tag 的删除:
git push origin :refs/tags/<tagName>
如下所示:
git tag -d 12345 #删除本地记录
git push origin :refs/tags/12345 #删除远程记录
把本地tag 推送到远端:
git push origin :<tagName>
- 检出标签
git checkout -b <branchName> <tagName>
因为 tag 本身指向的就是一个 commit,所以和根据commit id 检出分支是一个道理。
但是需要特别说明的是,如果我们想要修改 tag检出代码分支,那么虽然分支中的代码改变了,但是 tag标记的 commit还是同一个,标记的代码是不会变的,这个要格外的注意。
其它
命令git tag -a <tagname> -m "XXX..." 可以指定标签信息。
命令git tag -a v0.1.0 -m "release 0.1.0 version" 创建附注标签。
命令git checkout [tagname] 切换标签。