git主要命令及作用
创建仓库
mkdir learngit
cd learngit
pwd
pwd是用来显示仓库所在位置的, 名字尽量不要用中文, 避免不必要的错误.
git init
git init 可以把仓库变成可用git管理
运行后在当前目录下会生成 .git 文件, 是用来跟踪管理版本库的, 没事儿不要乱改它, 否则就把仓库毁了.
这个文件默认隐藏, 用 ls -ah 命令可以看到.
把一个文件放到git仓库中
第一步: git add 文件名
使用git add 把文件添加到仓库, 一次添加一个文件.
**git跟踪的是修改而不是文件, 所以每一次修改都要执行一次git add才可以提交到commit中.
第二步: git commit -m “…”
使用 git commit 把文件提交到仓库, 一次可提交多个文件.
-m 后面的内容是对此文件的说明, 方便查找.
git commit命令执行成功后会出现1 file changed
: 一个文件被改动, 2 insertions
: 插入了两行内容
git status
时刻掌握仓库当前状态.
git diff 文件名
可用来查看上次对此文件做出了什么改动.
提交修改文件和提交新文件是一样的.
git log
查看提交日志
也可在后面加上 --pretty=oneline 这个参数变成 git log --pretty=oneline可以看到一长串十六进制数字, 这个是commit id
版本回退
git reset --hard HEAD^ 返回上一次的文件状态
HEAD^ : 返回上一次状态
HEAD^^ : 返回上上一次状态
.
.
.
HEAD~100 : 返回一百次前的状态
如果还想变回来, 只要窗口还没关,就可以找到刚刚那个最新版的commit id ,就可以使用git reset --hard 1094a
来变回来.
当然还有另一种方法,git reflog
可以展示命令历史.
工作区和暂存区
在电脑里能看到的目录就是工作区
隐藏文件夹 .git 不是工作区, 而是git的版本库, 其中最重要的就是state-暂存区, 还有一个自动创建的分支master , 以及指向master的一个指针HEAD
需要提交的文件都会放到暂存区, 然后将所有暂存区的文件一次性提交上去.
撤销修改
git checkout -- 文件名
返回到最近一次修改之前,git reset HEAD 文件名
将暂存区的修改撤掉, 重新放回工作区.
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
删除文件
git rm
如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
链接远程仓库github
- 登录github
- 右上角找到“Create a new repo”按钮
4. 在Repository name填入learngit
,其他不变,点击“Create repository”按钮,创建成功.
5. 可以在这个仓库克隆出新的仓库, 也可以让本地仓库与之关联,
6. 在本地仓库下运行git remote add origin [email protected]:GitHub账户名/仓库名.git
,添加后,远程库的名字就是origin,可以改但不需要.
7. git push -u origin master
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。git push origin master
仓库克隆
- 创建一个新的仓库, 勾选
Initialize this repository with a README
,会自动创建一个README.md
文件. - 克隆一个本地库
git clone [email protected]:账户名/仓库名.git
- Git支持多种协议,包括
https
,但通过ssh
支持的原生git
协议速度最快。
创建与合并分支
- 创建dev分支并切换到dev分支
git checkout -b dev
,git checkout
+-b
等同于git branch dev
+git checkout dev
git branch
查看所有分支, 在当前分支上会加一个*号.- 在dev上修改文件并
git add
- 切换回master
git checkout master
- 合并分支
git merge dev
- 合并完成后删除dev分支
git branch -d dev
- 最新版本的git :切换分支:
git switch <name>
创建+切换分支:git switch -c <name>
分支合并图
git log --graph
git merge --no-ff -m "merge with no-ff" dev
请注意--no-ff
参数,表示禁用Fast forward
,加上-m
参数是因为因为本次合并要创建一个新的commit
.
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
Bug
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动.
feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
多人协作
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; - 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
创建标签
- 命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
- 命令git tag -a -m "blablabla…"可以指定标签信息;
- 命令git tag可以查看所有标签。
操作标签
- 命令git push origin 可以推送一个本地标签;
- 命令git push origin --tags可以推送全部未推送过的本地标签;
- 命令git tag -d 可以删除一个本地标签;
- 命令git push origin :refs/tags/可以删除一个远程标签.
使用github
- 在GitHub上,可以任意Fork开源仓库;
- 自己拥有Fork后的仓库的读写权限;
- 可以推送pull request给官方仓库来贡献代码。