Git 开发日常

传统流程

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\ '

猜你喜欢

转载自blog.csdn.net/howeres/article/details/107587288