-
git init
用来将某目录变成Git可以管理的仓库 - 千万不要使用Windows自带的记事本编辑任何文本文件!!
-
git add <file>
用来将xx文件添加进仓库,可反复多次使用,添加多个文件;git add .
可以一次性添加所有改动的文件到仓库中 -
git commit -m
用来把上一步添加的文件提交到仓库,-m
后面是本次提交的描述,提交成功后会告诉我们有哪些改动 -
git status
命令可以让我们时刻掌握仓库当前的状态,比如说xx文件已被修改但未提交 -
git diff
可以看看具体修改了什么内容,显示的格式正是Unix通用的diff格式 -
git diff HEAD --<file>
,可以查看工作区和版本库里面最新版本的区别 -
git log --pretty=oneline
命令显示从最近到最远的提交日志,--pretty=oneline
用来单行输出,看得更清楚(可不加) - 在Git中,用
HEAD
表示当前版本,HEAD^
,HEAD^^
,HEAD~100
分别表示上一个、上上一个、上100个版本 -
git reset --hard <版本>
可以回退到指定版本,这个版本是根据commit
来的,每commit
一次就是一个版本,一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失。但是如果把自己的本地版本库推送到远程仓库了,那么就不能回退了 - 回退版本后可以通过
git log
中的commit id
来返回回退之前的版本,前提是命令行窗口还没有被关掉,且知道要回去的版本的commit id
的前几位;否则就需要通过git reflog
来查看命令记录,每个commit
命令记录前会有相应的commit id
- Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD指向回退版本,顺便把工作区的文件更新了!!
- 工作区: 在电脑里能看到的目录
-
版本库: 工作区有一个隐藏目录
.git
,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage
(或者叫index)的暂存区,还有Git
为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
* 第一步是用`git add`把文件添加进去,实际上就是把文件修改添加到暂存区
* 第二步是用`git commit`提交更改,实际上就是把暂存区的所有内容提交到当前分支
* 即需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改到分支中(默认只有`master`分支)
* `git commit`只会提交暂存区中的文件,如果被修改的文件没有通过`git add`添加到暂存区中,那么就不会被`git commit`提交
- Git比其他版本控制系统设计得优秀,是因为Git跟踪并管理的是修改,而非文件
-
git checkout -- <file>
可以丢弃工作区的修改,就是让这个文件回到最近一次git commit
或git add
时的状态- file 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态
- file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态
-
git reset HEAD <file>
可以撤销掉(unstage)暂存区的修改,重新放回工作区 -
file修改后添加到暂存区了,又再次修改了,要想回到第一次修改前,可以如下操作
- 先
git checkout -- <file>
回到第一次修改添加到暂存区后的状态,此时已丢弃第二次修改 - 再
git reset HEAD <file>
撤销暂存区的修改,此时file回到第一次修改后,暂存区为空 - 最后
git checkout -- <file>
丢弃工作区的修改,此时已丢弃第一次修改,回到原始状态
- 先
-
git rm
用于删除一个文件(与git add
一样执行后放到暂存区)。 -
关联一个远程库
git remote add origin git@server-name:path/repo-name.git
git remote add origin <https>链接
- 关联后,使用命令
git push -u origin master
第一次推送master分支的所有内容
-
分支管理
- 在Git里,master分支为主分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支
- 切换到哪个分支,HEAD就指向哪个分支
-
git branch
查看分支,当前分支前面会有 * -
git branch <name>
创建分支 -
git checkout <name>
切换分支 -
git checkout -b <name>
,加上-b
表示创建并切换到新分支 -
git merge <name>
合并某分支到当前分支 -
git branch -d <name>
删除分支 - 创建分支dev完成某个任务后,切换回master分支进行合并,再删掉dev分支,这和直接在master分支上工作效果是一样的,但过程更安全
-
合并分支之解决冲突
- 合并有时候会有冲突,此时git 会提示有冲突,需要我们手动解决冲突
- 查看冲突文件会看到Git用
<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容 - 修改冲突完毕后,即可
git add
并git commit
-
git log --graph
可以看到分支合并图 -
git log --graph --pretty=oneline --abbrev-commit
可以更清楚的看出分支合并的情况
-
分支管理策略
-
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活 - 干活都在
dev
分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并master
上,在master
分支发布1.0版本 - 每个人都在
dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。 - 合并分支时,加上
--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而`fast forward
合并就看不出来曾经做过合并
-
-
Bug分支
- 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除
-
git stash
可以储藏工作现场 -
git stash list
可以查看工作现场列表 -
git stash apply
恢复工作现场,git stash drop
删除stash内容 -
git stash pop
恢复的同时把stash内容也删了,相当于上面的两步 - 当手头工作没有完成时,先把工作现场
git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
-
Feature分支、
- 添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个
feature
分支,在上面开发,完成后,合并,最后,删除该feature
分支 - 丢弃一个没有被合并过的分支,可以通过
git branch -D <name>
强行删除
- 添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个
-
多人协作
- 当你从远程仓库克隆时,实际上
Git
自动把本地的master
分支和远程的master
分支对应起来了,并且,远程仓库的默认名称是origin
- 查看远程库的信息,用
git remote
;用git remote -v
显示更详细的信息 -
git push origin <name>
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支的名称,这样,Git就会把该分支推送到远程库对应的远程分支上 -
多人协作的工作模式通常是下面这样
- 首先,可以试图用
git push origin branch-name
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功! - 如果
git pull
提示“no tracking information”
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
- 首先,可以试图用
- 当你从远程仓库克隆时,实际上
-
标签管理
- 发布一个版本时,我们通常先在版本库中打一个标签
(tag)
,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照 -
git tag <name>
即可打标签,默认标签是打在最新提交的commit
上的。要在特定的commit
上打标签,需要用git reflog
找到历史提交的commit id
, 然后使用git tag <name> <id>
打上即可 -
git tag
查看所有标签 -
git show <tagname>
查看标签信息 -
git tag -a <tagname> -m "blablabla..."
可以指定标签信息 -
git tag -s <tagname> -m "blablabla..."
可以用PGP签名标签 -
git tag -d <tagname>
删除本地标签 - 创建的标签都只存储在本地,不会自动推送到远程,如果要推送某个标签到远程,使用命令
git push origin <tagname>
-
git push origin --tags
一次性推送全部尚未推送到远程的本地标签 -
git push origin :refs/tags/<tagname>
可以删除一个远程标签
- 发布一个版本时,我们通常先在版本库中打一个标签
-
忽略特殊文件
- 在Git工作区的根目录下创建一个特殊的
.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件 -
.gitignore
文件本身要放到版本库里,并且可以对.gitignore
做版本管理 -
git check-ignore -v <file>
可以检查某文件的忽略情况
- 在Git工作区的根目录下创建一个特殊的
-
配置别名
git config --global alias.st status
- 上面这一句告诉
Git
以后st
就代表status
-
--global
参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。