git使用(Linux)
常用命令写在前面以便查阅
git log remotes/origin/master查看远程提交记录
git push origin --delete develop-kidl-add删除远程分支
git tag -a v1.0 给重要的版本打上标签
git commit --amend修改注释
git remote -v显示所有远程仓库
git push origin HEAD:refs/for/develop提交到远程develop分支
配置git账号
下载git:apt-get install git
输入命令:
git config --global user.name “github用户名”
git config --global user.email “github邮箱”
这些内容会被保存在/root下的.gitconfig文件中,如果想修改就可以修改这里,而且ssh密钥是根据这个生成的,所以改了这里之后需要重新生成秘钥,生成秘钥的命令如下(若没有上传到github的需求,不用执行以下操作),输入命令:
ssh-keygen -t rsa -C "github邮箱"之后一直回车即可。
我的shh秘钥位置:/root/.ssh/id_rsa,在/root/.ssh下有两个文件,一个是私钥,一个.pub文件是公钥,将公钥提交到github中。
将密钥提交到github中,注意最后的邮箱不用加,输入命令:
ssh -T git@github.com
如果提示success那么就成功将自己的Ubuntu和github关联了起来
远程&Github使用
在github中创建一个仓库 repository。
如下图可以选择有些类型的文件被git忽视,忽视没用的文件,让git的跟踪看起来更清爽一点。
github上传项目
步骤:
1.在github中申请的repository
2.在新目录下要初始化一下:git init
链接远程仓库:git remote add origin git@github.com:在github中申请的repository的路径.git
git add 文件名
提交到本地仓库:git commit -m “edition1”
将提交的内容同步至github:git push -u origin master
(如果正常可以提交文件,不要使用强制提及;如果正常提交失败,可以尝试强制提交)
强制提交: git push -u origin +master
(问题: 拒绝上传
解决:修改配置文件
1.进入当前共享文件的 .git 目录 cd .git
2.编辑 config vim config
3.将url地址改成github中项目的 ssh地址
4.保存并退出
5.再次提交, 不需要输入账号密码)
github更新项目
git clone git项目地址(项目地址看在github中取)比如:
git clone git@github.com:richard/java.git
克隆如果出错,执行以下语句:
eval “$(ssh-agent -s)”
ssh-add
github将本地分支跟踪服务器分支
git branch --set-upstream-to=origin/远程分支名 本地分支名
跟踪了远程分支之后我们想要同步至服务器只需要git push , 而不需要git push -u origin 远程分支名。
从远程分支上拉取代码
git pull origin 分支名称
git本地操作
git init在当前文件夹下创建起一个git,ls -la能看到一个.git文件
git add 文件
git commit -m ‘版本描述’
git log查看都记录了那些版本
注意git log只记录当前版本以及之前的版本
也就是当reset回滚版本后,新版本将不能在git log中查看
有个HEAD指针,记录当前版本位置,前一个版本是HEAD^
,或者是HEAD~1
,以此类推,前2个版本就是HEAD^^
,或者是HEAD~2
。
git reset --hard HEAD^
git reset --hard 版本描述符
版本描述符在log中查看,当版本过多一行显示不完那么可以用git log --pretty=oneline来精简显示
工作区&版本库
工作区就是我们的当前目录
版本库就是.git文件
.git文件中最重要的一个概念就是暂存区
新版本相较于前一个版本只记录修改的地方
git status查看状态
git reflog查看之前操作的记录
git checkout – 文件名,将未加载到暂存区的但是已经修改的文件剔除
add就是将修改了的文件加载到暂存区
如果已经添加到了暂存区,但是想要将文件剔除出暂存区,那么使用git reset HEAD 文件名,和add互为逆操作
如果已经提交成了一个版本,那么用reset进行版本回滚。但是这个版本并不是被删除了。
——————————————————————————————————————
对比版本库和工作区中文件的不同:
git diff HEAD – 文件名
—代表HEAD中的文件
+++代表工作区的文件
对比不同版本库中的文件不同:
git diff HEAD HEAD^文件名
就是对比HEAD版和HEAD^版的不同
对比一个文件做了什么改动:
git diff 文件名
git diff:当工作区有改动,临时区为空,diff的对比是“工作区与最后一次commit提交的仓库的共同文件”;当工作区有改动,临时区不为空,diff对比的是“工作区与暂存区的共同文件”。
git diff --cached 或 git diff --staged:显示暂存区(已add但未commit文件)和最后一次commit(HEAD)之间的所有不相同文件的增删改(git diff --cached和git diff –staged相同作用)
git diff HEAD:显示工作目录(已track但未add文件)和暂存区(已add但未commit文件)与最后一次commit之间的的所有不相同文件的增删改。
git diff HEAD~X或git diff HEAD^^…(后面有X个符号,X为正整数):可以查看最近一次提交的版本与往过去时间线前数X个的版本之间的所有同(3)中定义文件之间的增删改。
git diff <分支名1> <分支名2> :比较两个分支上最后 commit 的内容的差别
git diff branch1 branch2 --stat 显示出所有有差异的文件(不详细,没有对比内容)
git diff branch1 branch2 显示出所有有差异的文件的详细差异(更详细)
git diff branch1 branch2 具体文件路径 显示指定文件的详细差异(对比内容)
——————————————————————————————————————
删除文件:
在rm文件后需要对暂存区也进行操作:git rm 文件名 或者 git add 文件名
如果删除了文件但是想要撤销这个删除操作时,那么 git checkout – 文件名,再次ls时就会发现被rm的文件又回来了
如果对暂存区已经进行了操作但是又想将文件找回来,使用git reset HEAD 文件名
如果删除并且提交了版本,但是想将文件找回来,那么用reset进行版本回滚。
git分支操作
git把之前每次提交的版本串成一条时间线,当前我们有一条分支,叫master分支。HEAD严格来说不是指向提交,而是指向master,如图:主分支
创建dev分支:
注意创建完分支,之后的操作就和主分支无关了,dev往前迭代,master不动,如图:
可以将master和dev合并:
可以将分支删除:
查看当前有几个分支:git branch
查看远程有几个分支:git branch -a
创建并切换到一个新分支:git checkout -b dev
切换到一个分支:git checkout dev
合并分支:git merge dev(默认是快速合并,前提是没有冲突)
删除分支:git branch -d dev,注意删除分支只是将那个指向版本记录的指针删除了,并没有将之前做的操作痕迹删除,(删除分支后执行git log --graph --pretty=oneline就能看到)
冲突的解决:
分支开始后如果分支都修改了同一个文件并且都提交了新版本就会有冲突,就不能快速合并。
那么我们要解决冲突,当我们merge失败后,vi进入有冲突的文件中,文件会有冲突位置的提示:
<<<<<<< HEAD
this is the third part
qwer
=======
asdf
>>>>>>> master
当前所在的分支是HEAD,也就是dev,和master的冲突内容为
this is the third part
qwer
而master和dev的冲突内容为asdf,那么现在我们要自己进行判断,到底留哪些内容,或者全部都留下或者删除。
修改完后再次提交版本,就解决了冲突,就可以merge了,merge后的状态如下:
git log --graph --pretty=oneline能显示状态,如:
root@ubuntu:/mnt/hgfs/winshare/git_test# git log --graph --pretty=oneline
* de20a6520c3e4631d20f0a8bd15379c238f35a99 (HEAD -> dev) jiejuechongtu
|\
| * 39149124bad06bdb89a710d0eabede7ced5b8044 (master) edit2
* | 5c632cc14747c877a7fc86a91c86c549c6111c97 edit1
* | 358de76451ec4c5e2a519d6d234f9897b32c9787 edition3
|/
* 4fbf385369438c1ec02ffd92c746c902ae2b2dd8 edition2
* ae10203a1c1f9fd9e331ab9c8d798ccb4b99b0f6 edition1
还有一种情况也不能快速合并:两分支对不同的文件修改并提交,这个情况下并没有起冲突,但是却不能用快速合并,这个时候git合并之后会帮你做一次新的提交,自动进入一个shell让你输入提交需要的参数。
Merge made by the 'recursive' strategy.
code2.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 code2.txt
完成合并。
有些时候我们需要禁用快速合并:
比方说有时候想保存分支的记录那么就要禁用快速合并:
git merge --no-ff ‘fast_forward_prohibited’ dev
就会将master自动提交一次,然后进行合并,那么就将分支记录保留下来了。
Bug分支情况:
每个bug都可以通过一个新的临时分支来修复,修复后合并分支然后将临时分支删除。可见git的强大和其理念的优秀。
当出现一个紧急bug需要修复,但是当前的工作还没有提交:git提供了一个功能:stash,将当前的工作现场保存起来,bug修复完后返回现场继续工作。
git stash保存现场
git stash list列出被保存的现场
git stash pop恢复现场
以下内容来自:https://www.cnblogs.com/sorasing/p/11975748.html
最近git用的比较多,因为是实验室多个人维护一个仓库,经常会有合并冲突的情况,就学习了一下git stash的用法,目前有两个场景非常常用:
- 有人与我改动同一分支
我在本地修改好后,发现远程分支已经被改动了,此时我本地也被改动了就造成了冲突,无法push或者pull。
此时可以使用git stash:
1 git stash //把本地的改动暂存起来
2 git pull //拉取远端分支(此时本地分支会回滚到上次commit的情况,新的改动都存在了stash中)
3 git stash pop // 将栈顶改动重新加回本地分支,就可以继续修改了,当然,如果改好了就是add,commit,push啥的。。
- 不小心改动了其他分支,例如忘记切换,直接在master分支上做改动,这里假设我的分支是test分支
git stash //把本地当前改动暂存起来,此时master分支就恢复到了上次拉取时的状态
git checkout test //切换到需要改动的分支
git stash pop //将改动pop到自己当前的分支
小结以及一些扩展:
顾名思义,stash就是一个栈,平时我们把需要暂存的文件存到栈中,把代码恢复到上次拉取的状态以进行操作,而git stash pop 就是让栈顶元素出栈并删除。
git stash apply 则是只取栈顶元素,但是不删除。
这样会有一个显而易见后果,如果我再次执行git stash,新的改动将会出现在栈顶,栈中元素会越来越多,此时可以使用 git stash list 命令查看栈中元素,此时每个栈中元素会有自己对应的编号
使用git stash apply stash@{0} (0可以换成对应编号),来添加不同改动。同样,你也可以 git stash drop stash@{0} 来删除对应改动。
git stash clear 可以清空 stash list
就我个人而言,git stash pop就已经满足日常需要了,所以我的stash list里日常只有编号0 和空