传统流程
Traditional Ways
[分支名]$ git checkout -b dev #开发的时候创建一条自己的分支
############################
###########开发#############
############################
[dev] $ git rebase -i master #合并提交记录
[dev] $ git checkout master
[master]$ git pull
[master]$ git checkout dev
[dev] $ git rebase master #有冲突解决冲突,继续:git rebase --continue
[dev] $ git checkout master
[master]$ git merge dev
[master]$ git push
Tips:重心放在本地。除了git push,其他常用命令不会对远程仓库造成破坏性影响
常用命令
一、版本回退
#实验:本地回退版本,硬回退(适合自己一个人玩,回退私人仓库的)
$ git reset --hard origin/master #本地分支和远程分支保持一致
$ git reset --hard Oldid #回退旧版本
$ git push -f (慎用! 慎用! 慎用!) #优点:版本线会比较干净
#真正的远程回退:revert,意思是撤销某次提交。它会产生一个新的提交,虽然代码回退了,但是版本依然是向前的,所以,当你用revert回退之后,所有人pull之后,他们的代码也自动的回退了。
$ git revert HEAD~1 #从0开始, 这是回退上上次
HEAD^1==HEAD~1 HEAD^^==HEAD~2!=HEAD^2
#3.错的太远了直接将代码全部删掉,用正确代码替代
二、分支管理
# 删除远程分支
$ git push origin :dev #推送一个空分支(:前面为空)到远程分支,其实就相当于删除远程分支
or
$ git push origin --delete <remote-branchname> #git push origin -d 另外,-dr(-d加-r)只删除git branch -r列表中的{追踪分支},并不删除远程分支。
## 新建空白分支
$ git checkout --orphan null_branch # 必须初始化提交,再push:git commit -am "Init commit."
$ git rm -r --cached .
$ git commit -am "init commit" # 必须提交初始化commit,再push到远程仓库
## 新分支同步到远程分支
$ git push origin local_branch_name:remote_branch_name
## 本地新建远程对应分支
$ git checkout -t origin/branchName # git config user.name "xxx" 老是忘记这条(请忽略
三、跟踪(远程与本地相关联)
#建立连接(曾经是set-upstream后面改为set-uptream-to)
$ git branch --set-upstream-to=origin/dev
$ git branch -u origin/dev
#取消对master的跟踪
$ git branch --unset-upstream master
#查看当前分支的upstream(跟踪情况)
$ git branch -vv
四、Git Rebase
把dev分支接到master的后面
[master]$ git checkout dev
[dev] $ git rebase master #以master为基准
两条合并为: $ git rebase master dev
意思为: $ git rebase <new base> <branch name>
master在前, dev在后 < 新基准 > < 分支名 >
五、Git Rebase -i
语法: $ git rebase -i [startpoint] [endpoint]
其中-i的意思是--interactive ( 交互式的进行, 即vi式 ), 不写endpoint 默认为HEAD , 并且该区间为 (start,end] 前开后闭区间 ( 引用自简书用户liqingbiubiu )
- pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
$ git rebase -i 36224db (ps:不包含36224db这条记录, 如需要包含则写36224db^)
或
$ git rebase -i HEAD~3
$ git rebase -i master #表示基于master合并多次提交,并改变自己的历史提交记录,以保持远程仓库的历史为一条直线,不会有merge一行
会进入两个选项:pick、s代表跳过
还会有commit信息重新编辑
六、Git Rebase <新内容分支> --onto <旧分支>
- 复制某个区间的提交记录到另一个分支
~第一步:
$ git rebase 90bc0045b^ 5de0da9f2 --onto master
onto意思为: git rebase <after this commit> <to this commit> --onto <new base>
~此时master的HEAD处于游离状态(detached HEAD), git只是将区间部分的提交内容复制一份粘贴到了master所指向的提交后面, 我们需要将master所指向的HEAD设置为当前指向的提交id.
$ git checkout master
$ git reset --hard 0c72e64 (左边为, checkout master显示的id)
- 如果是单独挑选几个游离的提交进行复制, 可以使用 git cherry-pick
$ git checkout dev
$ git cherry-pick 60cd8ab 1988bca d83549a
意思是: 复制上面三个提交记录到dev分支(这个三个提交是其他分支的)
七、密钥生成
- 生成密钥,用于连接远程仓库无需使用密码,原理见我的另一篇博客;
$ ssh-keygen -t rsa -C "[email protected]"
-- -t 代表 type 指定要创建的密钥类型。可以使用:"rsa1"(SSH-1) "rsa"(SSH-2) "dsa"(SSH-2)
-- -C comment,提供一个新注释;
-- -c 要求修改私钥和公钥文件中的注释;只支持 RSA1 密钥;程序将提示输入私钥文件名、密语(如果存在)、新注释。
$ ssh-keygen -t rsa -b 4096 -C "[email protected]"
-- -b bits 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。
八、".ssh文件夹"迁移
- 以下是迁移文件夹到Linux系统电脑上, 达到复制密钥的目的. (当然, 你可以重新生成密钥并添加GitHub)
$ chmod 755 ~/.ssh/
$ chmod 600 ~/.ssh/id_rsa ~/.ssh/id_rsa*
$ chmod 644 ~/.ssh/known_hosts
#在~/.ssh/目录下
$ eval "$(ssh-agent -s)" # eval (start the ssh-agent in the background) ssh-agent -s (Agent pid 59566 添加生成的 SSH key 到 ssh-agent)
--ssh-agent是一种控制用来保存公钥身份验证所使用的私钥的程序
--其实ssh-agent就是一个密钥管理器,运行ssh-agent以后,使用ssh-add将私钥交给ssh-agent保管,其他程序需要身份验证的时候可以将验证申请交给ssh-agent来完成整个认证过程。
$ ssh-add #默认不写是加id_rsa
$ ssh-add id_rsa_github
$ ssh -T [email protected] #测试连接
##
九、暂存与版本回退
--闪存
$ git stash
$ git stash list #看有哪些闪存
$ git stash show stash@{
0} #看该闪存有哪些更改
--闪回
$ git stash pop
$ git status
$ git stash pop --index
--如果原来的文件修改已经添加到暂存区的,但用git stash pop 恢复进度后,修改却还在工作区,暂存区的修改被撤销了。这里运行git stash pop命令时带上一个 --index 的选项来告诉git重新应用被暂存的变更。
--撤销未保存的修改的
$ git checkout -- filename
--撤销add的
$ git reset HEAD a.txt
$ git log --oneline
--撤销本地commit
$ git reset --soft HEAD~1
--选项–soft 的作用就是把最新那次提交的所有改动撤回到暂存区。
--不再跟踪某个文件
$ git rm --cached a.txt # -r 删除文件夹 目录可为.
$ git restore --staged a.txt # 两句效果一样,任选一句喜欢的
十、忽略Yaml配置文件的修改
- 通常我们修改部分配置文件,只为了让项目在本地运行起来
- 我们不想提交修改, 然后又不想让他们占着位置changelist的位置
--忽略
$ git update-index --assume-unchanged src/main/resources/test.txt
--取消忽略
$ git update-index --no-assume-unchanged src/main/resources/test.txt
--查找忽略的文件(找到众多目录中, 以h开头标记的目录)
$ git ls-files -v |grep '^h\ '