git常用操作
基本命令
git -help
大概帮助,git --help
详细帮助
设置
git config --global user.name “your name”
设置使用git时得姓名和邮箱地址git config --global user.email “your email”
这个命令,会在“~/.gitconfig”
中以如下形式输出设置文件。在github上公开的仓库提交日志的时候,这里设置的姓名和邮箱也会被公开。Git config -–global color.ui auto
让命令得输出拥有更高的可读性
获取远程仓库的代码
git clone url
克隆远程地址的源码Git clone git@github.com : hirocastest/Hello-World.git
,将已有仓库添加到身边的开发环境中,这个命名可以将远程仓库中的代码拉取到本地仓库,执行git clone
命令后我们会默认处在master分支,同时系统会自动将origin设置成远程仓库的标识符。也就是说但当前仓库的master分支与Github上远程仓库origin的master分支在内容上是一样的
在本地初始化版本管理仓库
git init
初始化本地仓库,使用的场景为本地项目还没有创建git版本管理仓库,执行之后就能够在本地进行版本管理
为本地仓库关联远程仓库地址
git remote add origin https://github.com/Myjacklee/repositoryName.git
将创建好的仓库与本地仓库进行关联,什么是origin,origin是远程仓库的别名,当我们在本地init了一个git版本库之后,执行一个git remote add origin git@github.com:zonggenli/myProject.git
,这里的origin就是远程仓库的别名,其实我们完全不用按照github上面的指引,比如我们把origin设置成lizonggen
也是行的
push
- 命令格式
git push <远程主机名> <本地分支名>:<远程分支名>
git push -u origin master
将本地新创建的仓库推送到远程的空仓库(注意远程的空仓库是空的,如果之前刚设置过远程仓库的地址,且远程仓库初始化的时候添加了初始化文件,执行push后则会出现错误,需要先执行 git pull 操作将远程仓库中的内容拉取到本地进行合并操作),当前分支的内容会被推送给远程仓库origin的master分支,-u
可以正在推送的时候,将origin仓库的master分支设置为本地仓库当前分支的upstream(上游)。添加了该参数之后,将来运行git pull
,命令从远程仓库分支获取内容时,本地仓库的这个分支就可以直接从origin的master分支获取内容,之后将代码推送到远程仓库的时候如果只执行git push
操作则会默认推送到当前分支的上游分支上去。git push -u origin feature-D
,在本地床创建一个新的分支并推送到远程仓库,为远程仓库新建一个同名分支,除了master分支之外,远程仓库也可以创建其它分支git checkout -b feature-D
,比如我们在本地仓库创建feature-D分支,并将它以同名的形式push到远程的仓库中
fetch
-
git fetch upstream
从远程仓库获取实时代码,与自己仓库的分支进行合并 -
git fetch
,对于git fetch可以理解为 git pull = git fetch <branchName>+ git merge FETCH_HEAD(FETCH_HEAD是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息,通过git log -p FETCH_HEAD
可以查看到更新的信息),git fetch是将远程主机得最新内容拉取到本地,用检查了再决定是否合并到本机分支当中,如果决定合并分支分支则使用git merge FETCH_HEAD
进行合并操作,而git pull则是将远程主机的最新内容拉取下来后直接进行合并,可能会产生冲突,需要手动解决git fetch <远程主机名>
将远程主机的更新全部取回本地git fetch <远程主机名> <分支名>
获取远程主机的指定分支
pull
-
git pull <远程主机名> <远程分支名>:<本地分支名>
-
git pull 使用场景,如果之前在本地使用git进行了项目管理,然后突然有一天你想把本地的git推送到远程服务器,于是你在github上新建了一个项目,并勾选了init README.md选项,当在本地git使用push命令会出现错误,使用pull也会出现错误,这是因为绑定了两个相关的历史版本信息,需要执行一下命令
git pull origin <branch> --allow-unrelated-histories
进行冲突解决
status
Git status
用于显示工作目录和暂存区的状态。(红色的文件还在工作区)使用此命令能看到哪些修改被暂存到了,那些没有,哪些文件没有被git tracked
到。Git status
不显示已经commit到项目历史中的信息。看历史信息要使用git log
add
Git add
将文件内容添加到索引(将修改添加到暂存区)。也就是将要提交的文件的信息添加到索引库中,git add .
当前文件夹中所有文件添加到暂存区
commit
Git commit
可以将当前暂存区中的文件实际保存在仓库的历史记录当中。比如git commit -m “first commit”,-m
参数后的first commit
称作提交信息,是对这个提交的概述。git commit -am "massage"
一次完成添加到暂存区和提交到仓库的历史记录中git commit --amend
如果要修改上一条提交信息,则可使用该命令,执行命令后会启动编辑器,修改编辑器中相关的内容就可以完成更改
log
git log
查看以往仓库的提交日志git log –pretty=short
以简短的一行显示提交的日志git log filename
查看对应文件的提交日志git log -p
查看提交所带来的改动git log --graph
以图标的形式查看分支
diff
git diff
查看工作树与暂存区的差别git diff HEAD
查看工作树与最新提交的差别,不妨养成这样的好习惯,在执行git commit命令的之前先执行git diff HEAD命令,查看本次提交与上次提交之间有什么差别,等确定完毕后再提交
分支操作
master 分支是Git默认创建的分支,因此基本上所有的开发都是以这个分支进行的,在进行团队合作的时候通常会有一个release分支,团队成员接到任务之后会基于release分支创建新的分支,并在新的分支开发特性分支,开发完毕后再合入release分支
branch
git branch
显示分支一览表,添加-a
参数可以同时显示本地仓库和远程仓库分支的信息。git branch -vv
显示当前所有分支与远程分支的关系git branch -m oldName newName
更名git branch -d branchName
删除分支- 删除分支操作 :
git branch -a
查看本地分支和远程分支git push origin --delete (branchname) | git branch -d -r <branchname>
删除远程分支git branch -a
再次验证远程分支是否被删除,若被删除:git branch -d (branchname)
删除本地分支(在删除某一分支的时候需要切换到其他分支)
checkout
git checkout -b feature-A
创建名为feature-A的分支下面的代码效果相同
git branch feature-A
git checkout feature-A
在分支feature-A做的操作不会影响到master分支,因此做git checkout master
后再查看代码,会发现在分支feature-A做的操作已经没有了
git checkout -b feature-D origin/feature-D
获取远程仓库中feature-D分支的内容,-b
参数后面是新建的分支名称,新建分支后面是获取来源分支的名称。例子中指定了origin /feature-D
,也就是说以名为origin的仓库(这里指github段的仓库)的feature-D分支为来源,在本地仓库中创建feature-D分支,这里的本地feature-D的上游分支就是远程仓库的feature-D分支,如果这时再执行git checkout -b feature-F origin/feature-D
,则会在本地创建一个feature-F分支,这个分支的上游分支也是 origin/feature-D分支,如果同时进行push则可能会产生冲突git reflog show <分支名>
查看对应分支是从哪一个分支拉出来的
merge
git merge –no-ff feature-A
合并分支feature-A到master主分支,注意feature分支并不会被删除掉 -no-ff 不使用fast-forward方式合并,保留分支的commit历史
reflog
git reflog
查看当前仓库的操作日志,在日志中可以看到commit、checkout、reset、merge等Git命令的执行记录,只要不进行Git的GC操作,就可以随意调调取到近期的历史状态
stash
-
git stash
在没有add之前用于临时保存修改,常见的开发场景有开发到一半的时候,代码还不想提交,然后需要去同步远端的代码。如果本地的代码和远程代码没有冲突,可以直接通过pull进行,然是如果发生了冲突,直接git pull会拒绝覆盖当前的修改,遇到这种情况先需要保存本地的代码,再进行git pull,然后再pop出本地的代码(进一步理解)场景二:你在你的分支进行开发,开发到一半突然接到另外一个需求,需要新建一个分支进行bug修复操作,但是如果你的代码不进行提交则不能进行分支切换,这时候可以执行git stash命令保存本地代码,然后切换到其他分支进行bug修复,待开发完成之后再切换回来
git stash 保存本地代码(包括暂存的和非暂存的)
git pull 拉去远程的代码 //todo 需要测试的如果远程仓库已经被别人更新了,自己与远程仓库的内容有冲突,然后进行
git pull
操作git stash pop(这个应用后就直接弹出了) | git stash apply(这个可以将stash应用于多分分支)恢复临时的代码
git stash list 查看现有的stash
git stash drop 删除stash
git stash show 查看对应的stash的变更 ,添加
-p
查看特定stash的全部diff
rebase
-
git rebase
场景介绍,假设现在基于远程分支master创建一个叫mywork分支,然后你在你的分支上有两个提交,与此同时master分支也做了一些修改并做了两个提交,这就意味这这两个分支同时前进了,这个时候可以选择使用pull命令把master分支上的修改拉下来并与你的修改进行合并,看起来就像是一个新的合并提交,具体的操作为先切换到master分支使用git pull命令拉取远程仓库的代码,然后切换到自己的分支git checkout mywork
,然后执行git rebase master
,这个命令会将自己的分支中每个提交commit都取消掉,并把他们临时保存为补丁,然后把mywork更新为最新的分支状态,最后把这些补丁应用到新的mywork分支上,mywork分支更新之后它会指向新的提交,旧的提交随之会被丢弃掉在执行rebase 的过程当中可能会出现冲突,出现冲突的时候Git会停止rebase并让你去解决冲突,在解决完冲突之后,使用git add命令去更新这些操作,但是不需要执行git commit,只需要仅需执行
git rebase --continue
命令,这样git会继续应用剩余的补丁,如果想终止rebase可以执行git rebase --abort
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F0I2SwCJ-1628407473920)(.image/image-20210731170035636.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U0lANvyP-1628407473923)(.image/image-20210731170223800.png)]
-
git rebase -i HEAD~2
用该命令可选定当前分支中包含HEAD(最新提交)在内的两个最新历史记录为对象,并在编辑器中打开,将第二行的pick修改为fixup,这样两个提交记录就合并到了一个提交记录了
常见情景
在本地新建一个分支并推送到远程仓库:
- git branch -a 查看所有分支
- git checkout -b dev_lzg dev,以本地的dev分支为基新建dev_lzg分支,
- git push origin dev_lzg:dev_lzg 将本地的dev_lzg分支推送到远程的dev_lzg分支
git push <远程主机> <远程分支名>:<本地分支名>
git branch --set-upstream-to=origin/dev_lzg
将本地分支与远程分支进行关联,如果该步没有执行则拉取远程的代码需要执行git pull origin dev_lzg 需要标明远程分支的具体分支名
回溯历史
-
git reset --hard hashcode
回溯历史[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2iq6s65q-1628407473924)(E:\图片\mdImage\image-20200520162034389.png)]
回溯到创建feature-A分支之前,创建一个名为fix-B特性的分支,要让仓库的HEAD、暂存区、当前工作树回溯到指定状态就要用
git reset --hard
命令,只要提供目标时间点的哈希值就可以完全恢复到该时间点的状态