Git命令行
把文件添加到版本库
在创建好的目录下创建新的git版本库
git init
把文件添加到仓库
git add filename
把文件提交到版本库
git commit -m "message"
查看仓库的当前状态
git status
查看修改内容
git diff filename
时光机穿梭
显示从最近到最远的提交日志
git log
使日志一行显示
git log --pretty=oneline
回退到上一个版本
git reset --hard HEAD^
查看文件中内容
cat filename
去到最新的版本
git reset --hard commitid
获取commit id
git reflog
reflog会记录每一次的命令,以确定要回到未来的那个版本
管理修改
丢弃工作区的修改
git checkout -- filename
- 命令
git checkout -- filename
意思就是,把文件在工作区的修改全部撤销,这里有两种情况: - 一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
- 总之,就是让这个文件回到最近一次
git commit
或git add
时的状态。
**git checkout -- filename
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令 **
丢弃缓存区的修改
git reset HEAD filename
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
删除文件
删除操作说明
rm test.txt :删除工作区的文件
git rm test.txt:删除工作区和缓存区的文件
git commit -m "message":提交操作
撤回操作说明
git checkout -- test.txt
命令git rm file
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容
git rm file
删除工作区和暂存区的文件,直接checkout是无法还原的,需要从版本库reset下来,因为暂存区被删了。rm
只删除工作区的文件,直接checkout是可以还原的
git checkout
其实是用版本库(其中包含了stage或者叫index, 还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
)里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
远程仓库
添加远程库
将本地仓库关联到GitHub仓库
git remote add origin git@github.com:HongyeZhao/learngit.git
git remote add origin git@server-name:path/repo-name.git
添加后,远程仓库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库
把本地库上的所有内容推送到远程库上
git push -u origin master
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程
**由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。 **
把本地master分支的最新修改推送至GitHub
git push origin master
从远程库克隆
git clone git@github.com:HongyeZhao/gitskills.git
git clone git@server-name:path/repo-name.git
分支管理
创建与合并分支
创建dev
分支,然后切换dev
分支:
git checkout -b dev
git switch -c dev
**git checkout命令加上
-b`参数表示创建并切换,相当于以下两条命令: **
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
切换回master
分支
git checkout master
git switch master
切换回master
分支后,查看修改的内容,发现并没有修改,这是因为那个提交在dev
分支上,而master
分支此刻的提交点并没有变**
所以需要
把dev
分支的工作成果合并到master
分支上
git merge dev
**git merge
命令用于合并指定分支到当前分支。合并后,再查看readme.txt
的内容,就可以看到,和dev
分支的最新提交是完全一样的。 **
然后删除dev
标签
git branch -d dev
查看分支
git branch
小结
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch
切换分支:git checkout
或者git switch
创建+切换分支:git checkout -b
或者git switch -c
合并某分支到当前分支:git merge
删除分支:git branch -d
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph
命令可以看到分支合并图。
分支管理策略
通常,合并分支时,如果可能,Git会用Fast Forward
模式,但是在这种模式下,删除分支后,会丢失分支信息,如果要强制禁用Fast Forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看到分支信息。
合并dev
分支,请注意--no-ff
参数,表示禁用Fast forward
git merge --no-ff -m "message" dev
小结
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,在Fast forward
合并就看不出来曾经做过合并。
BUG分支
修复BUG时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
**当手头的工作没有完成时,先把工作做现场git stash
一下, 然后去修复bug,修复后,再git stash pop
,回到工作现场; **
在master分支上修复的bug,想要合并到当前dev
分支,可以用git cherry-pick
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
查看stash内容
git stash list
可以多次stash,回复时,先用git stash list
查看,然后回复指定的stash,用命令:
git stash apply stash@{0}
复制一个特定的提交到当前分支
git cherry-pick <commitid>
即将某分支上的修改提交到当前分支
Feature分支
强行删除分支(即分支未被合并就需要删除)
git branch -D feature-vulan
多人协作
查看远程库的信息
git remote
显示更详细信息
git remote -v
-v会显示可以抓取和推送的origin的地址,如果没有推送权限就看不到push地址
推送分支
git push origin <branch>
抓取分支
git pull
如果有冲突,就先处理冲突
在本地创建和远程分支对应的分支
git checkout -b branch-name origin/branch-name
本地和远程分支的名称最好一致
建立本地分支和远程分支的关联
git branch --set-upstream branch-name origin/branch-name
标签管理
创建标签
给当前的提交打上标签
git tag v1.0
标签默认是打在最新提交的commit上的。
查看标签
git tag
给过去的提交打上标签
git tag v0.9 commitid
查看标签的内容
git show v0.9
创建带有说明的标签,用-a
指定标签名,-m
指定说明文字
git tag -a v0.1 -m "version 0.1 released" commitid
小结
- 命令
git tag
用于新建一个标签,默认为HEAD
,也可以指定一个commit id; - 命令
git tag -a -m "blablabla..."
可以指定标签信息; - 命令
git tag
可以查看所有标签。
操作标签
删除本地标签
git tag -d v0.1
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。 如果推送某个标签到远程,如下
推送标签到远程
git push origin v1.0(tagname)
或者一次性推送全部尚未推送到远程的本地标签
git push origin --tags
删除远程标签
-
先删除本地标签
git tag -d v0.9(tagname)
-
然后从原地删除,删除命令样式push,但是格式如下
git push origin :refs/tags/v0.9
小结
- 命令
git push origin
可以推送一个本地标签; - 命令
git push origin --tags
可以推送全部未推送过的本地标签; - 命令
git tag -d
可以删除一个本地标签; - 命令
git push origin :refs/tags/
可以删除一个远程标签。