|
@@ -43,16 +43,16 @@ tags:
|
|
|
|
|
|
|
|
## 准备工作
|
|
## 准备工作
|
|
|
|
|
|
|
|
-- 安装过程中选择'User Git from Git Bash only',完全不修改 PATH 环境变量,仅在 Git Bash 中使用 Git
|
|
|
|
|
|
|
+- 安装过程中选择`User Git from Git Bash only`,表示完全不修改PATH环境变量,仅在Git Bash中使用Git
|
|
|
```shell
|
|
```shell
|
|
|
$ git --version //查看git是否安装成功及版本号
|
|
$ git --version //查看git是否安装成功及版本号
|
|
|
```
|
|
```
|
|
|
-- 设置签名:区分不同开发人员的身份
|
|
|
|
|
|
|
+- 设置签名用来区分不同开发人员的身份
|
|
|
```shell
|
|
```shell
|
|
|
$ git config --global user.name "tujidelv" //为该机器上所有的git仓库指定用户名
|
|
$ git config --global user.name "tujidelv" //为该机器上所有的git仓库指定用户名
|
|
|
$ git config --global user.email "tujide.lv@foxmail.com" //为该机器上所有的git仓库指定email地址
|
|
$ git config --global user.email "tujide.lv@foxmail.com" //为该机器上所有的git仓库指定email地址
|
|
|
```
|
|
```
|
|
|
- - 适当地显示不同的颜色
|
|
|
|
|
|
|
+- 适当地显示不同的颜色
|
|
|
```shell
|
|
```shell
|
|
|
$ git config --global color.ui true
|
|
$ git config --global color.ui true
|
|
|
```
|
|
```
|
|
@@ -61,22 +61,30 @@ tags:
|
|
|
|
|
|
|
|

|
|

|
|
|
- ### git add
|
|
- ### git add
|
|
|
- - 保存二进制对象:$ git hash-object -w test.txt
|
|
|
|
|
- - 把 test.txt 的当前内容压缩成二进制文件存入 Git。压缩后的二进制文件称为一个 Git 对象,保存在 .git/objects 目录,同时会计算当前内容的 SHA1 哈希值(长度 40 的字符串)作为该对象的文件名
|
|
|
|
|
- - .git/objects 下面的一个个子目录名是该哈希值的前 2 个字符,该子目录下面有一个文件,文件名是哈希值的后 38 个字符
|
|
|
|
|
- - 用 cat 命令查看该文件都是一些二进制字符(包括元数据),可用如下命令查看文件原始的文本内容:$ git cat-file -p e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
|
|
|
|
|
- - 更新暂存区:$ git update-index --add --cacheinfo 100644 \ 3b18e512dba79e4c8300dd08aeb37f8e728b8dad test.txt
|
|
|
|
|
|
|
+ - 保存二进制对象:`$ git hash-object -w test.txt`
|
|
|
|
|
+ ```
|
|
|
|
|
+ - 把test.txt的当前内容压缩成二进制文件存入Git,压缩后的二进制文件称为一个Git对象,保存在.git/objects目录,同时会计算当前内容的SHA1哈希值(长度40的字符串)作为该对象的文件名。
|
|
|
|
|
+ - .git/objects下面的一个个子目录名是该哈希值的前2个字符,该子目录下面有一个文件,文件名是哈希值的后38个字符。
|
|
|
|
|
+ - 用cat命令查看该文件都是一些二进制字符(包括元数据),可用如下命令查看文件原始的文本内容:$ git cat-file -p e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
|
|
|
|
|
+ ```
|
|
|
|
|
+ - 更新暂存区:`$ git update-index --add --cacheinfo 100644 \ 3b18e512dba79e4c8300dd08aeb37f8e728b8dad test.txt`
|
|
|
|
|
+ ```
|
|
|
- 用于在暂存区记录一个发生变动的文件
|
|
- 用于在暂存区记录一个发生变动的文件
|
|
|
- - 向暂存区(stage)写入文件名 test.txt、二进制对象名(哈希值)和文件权限(100 代表 regular file[普通文件],644 代表 rw-r--r--)
|
|
|
|
|
|
|
+ - 向暂存区(stage)写入文件名test.txt、二进制对象名(哈希值)和文件权限(100代表regular file[普通文件],644代表rw-r--r--)
|
|
|
|
|
+ ```
|
|
|
|
|
|
|
|
Tips:**Git提供了git add命令简化上面2步操作。**
|
|
Tips:**Git提供了git add命令简化上面2步操作。**
|
|
|
- ### git commit
|
|
- ### git commit
|
|
|
- - 保存当前目录结构:$ it write-tree
|
|
|
|
|
- - 将当前的目录结构生成一个 Git 对象,目录结构也是作为二进制对象保存的,也保存在 .git/objects 目录里面,对象名就是哈希值
|
|
|
|
|
- - 将目录树对象写入版本历史:$ echo "first commit" | git commit-tree c3b8bb102afeca86037d5b5dd89ceeb0090eae9d
|
|
|
|
|
- - 提交的时候需要有提交说明,echo "first commit"就是给出提交说明。然后,git commit-tree 命令将元数据和目录树,一起生成一个Git对象
|
|
|
|
|
- - 用 $ git cat-file -p 命令能看到本次快照对应的目录树对象(tree),作者和提交人信息,以及提交说明
|
|
|
|
|
|
|
+ - 保存当前目录结构:`$ git write-tree`
|
|
|
|
|
+ ```
|
|
|
|
|
+ - 将当前的目录结构生成一个Git对象,目录结构也是作为二进制对象保存的,也保存在.git/objects目录里面,对象名就是哈希值
|
|
|
|
|
+ ```
|
|
|
|
|
+ - 将目录树对象写入版本历史:`$ echo "first commit" | git commit-tree c3b8bb102afeca86037d5b5dd89ceeb0090eae9d`
|
|
|
|
|
+ ```
|
|
|
|
|
+ - 提交的时候需要有提交说明,echo "first commit"就是给出提交说明。然后git commit-tree命令将元数据和目录树,一起生成一个Git对象
|
|
|
|
|
+ - 用git cat-file -p命令能看到本次快照对应的目录树对象(tree),作者和提交人信息,以及提交说明
|
|
|
- 用如下命令也可以用来查看某个快照信息:$ git log --stat c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
|
|
- 用如下命令也可以用来查看某个快照信息:$ git log --stat c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
|
|
|
|
|
+ ```
|
|
|
|
|
|
|
|
Tips:**Git提供了git commit命令简化上面2步操作。**
|
|
Tips:**Git提供了git commit命令简化上面2步操作。**
|
|
|
|
|
|
|
@@ -84,17 +92,26 @@ tags:
|
|
|
- 常用命令
|
|
- 常用命令
|
|
|
```
|
|
```
|
|
|
- git help <命令>
|
|
- git help <命令>
|
|
|
- - git init //初始化版本库(把当前目录变成git可以管理的仓库[会在当前目录创建一个.git子目录,用来保存版本信息])
|
|
|
|
|
|
|
+ - git init [目录] //初始化版本库(把当前目录变成git可以管理的仓库[会在当前目录创建一个.git子目录,用来保存版本信息])
|
|
|
- git add <FILE...|DIR...> //告诉git把文件添加到仓库的暂存区,可反复多次使用,并且每次可添加多个文件
|
|
- git add <FILE...|DIR...> //告诉git把文件添加到仓库的暂存区,可反复多次使用,并且每次可添加多个文件
|
|
|
- 实际上就是把要提交的所有修改添加到暂存区(stage)
|
|
- 实际上就是把要提交的所有修改添加到暂存区(stage)
|
|
|
- git add --all/-A/. //对当前项目所有变动的文件,执行保存二进制对象和更新暂存区操作
|
|
- git add --all/-A/. //对当前项目所有变动的文件,执行保存二进制对象和更新暂存区操作
|
|
|
- - git commit -m "wrote a readme file" //告诉git把文件提交到仓库的分支(-m 后面输入的是本次提交的说明),一次可提交多个文件
|
|
|
|
|
|
|
+ - git commit [文件] -m "wrote a readme file" //告诉git把文件提交到仓库的分支(-m后面是本次提交的说明),一次可提交多个文件
|
|
|
- 实际上就是一次性把暂存区的所有修改提交到分支(master)
|
|
- 实际上就是一次性把暂存区的所有修改提交到分支(master)
|
|
|
- git status //查看工作区/暂存区的状态
|
|
- git status //查看工作区/暂存区的状态
|
|
|
- git status -s //返回一个简单版的 git status。我设置这个命令为默认 git status 来减少噪音。
|
|
- git status -s //返回一个简单版的 git status。我设置这个命令为默认 git status 来减少噪音。
|
|
|
- git diff [FILE] //如果git status提示有文件被修改,可以用此命令查看指定文件修改了哪些内容,显示的格式是Unix通用的diff格式
|
|
- git diff [FILE] //如果git status提示有文件被修改,可以用此命令查看指定文件修改了哪些内容,显示的格式是Unix通用的diff格式
|
|
|
- 比较的是版本库(暂存区和分支中的任意一个)与工作区同名文件相比是否相同,而git diff --cached比较的是暂存区有无内容
|
|
- 比较的是版本库(暂存区和分支中的任意一个)与工作区同名文件相比是否相同,而git diff --cached比较的是暂存区有无内容
|
|
|
- - git diff HEAD [FILE] //将工作区中的文件和本地库历史记录比较
|
|
|
|
|
|
|
+ - git diff HEAD [FILE] //将工作区中的文件和本地库历史记录比较
|
|
|
|
|
+ - git log //显示从最近到最远的提交日志。其中commit(快照) id是用SHA1算出的16进制数字
|
|
|
|
|
+ - 后面加上--pretty=oneline可以精简信息
|
|
|
|
|
+ - 后面加上--graph可以看到分支合并情况
|
|
|
|
|
+ - 后面加上--abbrev-commit可以精简快照id
|
|
|
|
|
+ - git reflog //查看命令历史,当找不到新版本的id时可以用此来确定要回到未来的哪个版本
|
|
|
|
|
+ - HEAD@{移动到当前版本需要多少步}
|
|
|
|
|
+ ```
|
|
|
|
|
+- 其他命令
|
|
|
|
|
+ ```
|
|
|
- git checkout -- <FILE>... //撤销此文件在工作区的修改(包括删除),回到最近一次commit或add时的状态
|
|
- git checkout -- <FILE>... //撤销此文件在工作区的修改(包括删除),回到最近一次commit或add时的状态
|
|
|
- git checkout -- . //撤销工作区所有的修改
|
|
- git checkout -- . //撤销工作区所有的修改
|
|
|
- git checkout -- *.java //撤销工作区所有java文件的修改
|
|
- git checkout -- *.java //撤销工作区所有java文件的修改
|
|
@@ -102,12 +119,6 @@ tags:
|
|
|
- git reset HEAD * //撤销暂存区所有的修改
|
|
- git reset HEAD * //撤销暂存区所有的修改
|
|
|
- git rm FILE //当想从版本库中删除文件时,可先在工作区删除,然后调用此命令,再commit
|
|
- git rm FILE //当想从版本库中删除文件时,可先在工作区删除,然后调用此命令,再commit
|
|
|
- git rm –cached FILE //只删除远程文件,但是不影响本地文件。这对删除已经推送过的忽略文件记录而且不影响本地文件是非常的方便的。
|
|
- git rm –cached FILE //只删除远程文件,但是不影响本地文件。这对删除已经推送过的忽略文件记录而且不影响本地文件是非常的方便的。
|
|
|
- - git log //显示从最近到最远的提交日志。其中commit(快照) id是用SHA1算出的16进制数字
|
|
|
|
|
- - 后面加上--pretty=oneline可以精简信息
|
|
|
|
|
- - 后面加上--graph可以看到分支合并情况
|
|
|
|
|
- - 后面加上--abbrev-commit可以精简快照id
|
|
|
|
|
- - git reflog //查看命令历史,当找不到新版本的id时可以用此来确定要回到未来的哪个版本
|
|
|
|
|
- - HEAD@{移动到当前版本需要多少步}
|
|
|
|
|
- git reset --hard HEAD~ //版本回退,HEAD代表当前版本,~代表回退到上个版本,如回到上100个版本可以用HEAD~100来表示
|
|
- git reset --hard HEAD~ //版本回退,HEAD代表当前版本,~代表回退到上个版本,如回到上100个版本可以用HEAD~100来表示
|
|
|
- git reset --hard 43ade3f //当想回到之前的新版本时(也能后退),可以找到它的commit id输入前几位即可(基于局部索引值操作,推荐)
|
|
- git reset --hard 43ade3f //当想回到之前的新版本时(也能后退),可以找到它的commit id输入前几位即可(基于局部索引值操作,推荐)
|
|
|
- --hard //会让当前工作区和暂存区的修改也撤销
|
|
- --hard //会让当前工作区和暂存区的修改也撤销
|
|
@@ -117,38 +128,35 @@ tags:
|
|
|
- 当手头工作没有完成时(工作区/暂存区有变动时),先把工作现场git stash隐藏一下,这样git status查看工作区是干净的,然后去修复bug,修复后,再git stash pop,回到份工作现场
|
|
- 当手头工作没有完成时(工作区/暂存区有变动时),先把工作现场git stash隐藏一下,这样git status查看工作区是干净的,然后去修复bug,修复后,再git stash pop,回到份工作现场
|
|
|
- git stash list //查看隐藏的工作现场
|
|
- git stash list //查看隐藏的工作现场
|
|
|
- git stash pop //恢复隐藏的工作现场,同时删除stash内容
|
|
- git stash pop //恢复隐藏的工作现场,同时删除stash内容
|
|
|
- ```
|
|
|
|
|
-- 其他命令
|
|
|
|
|
- ```
|
|
|
|
|
- git shortlog -sn //显示提交记录的参与者列表。和GitHub的参与者列表相同。
|
|
- git shortlog -sn //显示提交记录的参与者列表。和GitHub的参与者列表相同。
|
|
|
- - git reflog //显示你在本地已完成的操作列表。
|
|
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
## 分支管理
|
|
## 分支管理
|
|
|
|
|
|
|
|

|
|

|
|
|
-- 分支的好处
|
|
|
|
|
|
|
+- ### 分支的好处
|
|
|
- 同时并行推进多个功能开发,提高开发效率
|
|
- 同时并行推进多个功能开发,提高开发效率
|
|
|
- - 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可
|
|
|
|
|
-- 分支操作
|
|
|
|
|
- - 查看所有分支:$ git branch [-v]
|
|
|
|
|
- - 当前分支前面会标一个*号
|
|
|
|
|
- - 创建+切换分支:$ git checkout -b <name> [branch-name,可写可不写,依情况而定]
|
|
|
|
|
- - 创建分支:$ git branch <name>
|
|
|
|
|
- - 切换分支:$ git checkout <name>
|
|
|
|
|
- - 在本地创建和远程分支(必须已存在)对应的分支,名称最好一致:$ git checkout -b <branch-name> <origin/branch-name>
|
|
|
|
|
- - 合并指定分支到当前分支:git merge [-m "..."] <name>
|
|
|
|
|
- - Fast-forward,代表此次合并是"快进模式",即把当前分支(master)指向指定分支(dev)的当前提交,所以合并速度非常快,这种模式下,删除分支后,会丢失掉分支信息
|
|
|
|
|
- - 后面加上--no-ff 参数,表示禁用"Fast-forward",用普通模式合并,会创建一个新的 commit,合并后的历史能看到分支信息,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并
|
|
|
|
|
- - 删除分支:$ git branch -d <name>
|
|
|
|
|
- - $ git branch -D <name> 强行删除一个没有被合并过的分支(分支中只有空文件时可用普通方式-d删除分支)
|
|
|
|
|
-- 解决冲突
|
|
|
|
|
|
|
+ - 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,删除失败的分支重新开始即可
|
|
|
|
|
+- ### 分支操作
|
|
|
|
|
+ - 查看所有分支:`$ git branch [-v]`
|
|
|
|
|
+ >当前分支前面会标一个*号
|
|
|
|
|
+查看所有分支(包括远程分支):$ git branch -avv
|
|
|
|
|
+ - 创建+切换分支:`$ git checkout -b name [branch-name]`
|
|
|
|
|
+ >基于提交/指定分支(默认当前分支)创建新分支:$ git branch new-branch-name [branch-name | commit id]
|
|
|
|
|
+基于远程分支(必须已存在)创建与之对应的新分支:$ git branch new-branch-name <origin/branch-name>
|
|
|
|
|
+切换分支:$ git checkout branch-name
|
|
|
|
|
+ - 合并指定分支到当前分支:`$ git merge [-m "..."] <name>`
|
|
|
|
|
+ >Fast-forward,代表此次合并是"快进模式",即把当前分支(master)指向指定分支(dev)的当前提交,所以合并速度非常快,这种模式下,删除分支后,会丢失掉分支信息
|
|
|
|
|
+后面加上--no-ff 参数,表示禁用"Fast-forward",用普通模式合并,会创建一个新的 commit,合并后的历史能看到分支信息,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并
|
|
|
|
|
+ - 删除分支:`$ git branch -d <name>`
|
|
|
|
|
+ >$ git branch -D <name> 强行删除一个没有被合并过的分支(分支中只有空文件时可用普通方式-d删除分支)
|
|
|
|
|
+- ### 解决冲突
|
|
|
- 当 Git 无法自动合并分支时,须手动编辑文件解决冲突,然后再添加到暂存区再提交,合并完成
|
|
- 当 Git 无法自动合并分支时,须手动编辑文件解决冲突,然后再添加到暂存区再提交,合并完成
|
|
|
```
|
|
```
|
|
|
CONFLICT (content): Merge conflict in readme.txt
|
|
CONFLICT (content): Merge conflict in readme.txt
|
|
|
Automatic merge failed; fix conflicts and then commit the result.
|
|
Automatic merge failed; fix conflicts and then commit the result.
|
|
|
```
|
|
```
|
|
|
-- 分支管理策略
|
|
|
|
|
|
|
+- ### 分支管理策略
|
|
|
- 首先,master 主分支应该非常稳定,仅用来发布新版本,平时不能在上面干活;
|
|
- 首先,master 主分支应该非常稳定,仅用来发布新版本,平时不能在上面干活;
|
|
|
- 每个人干活都在 dev 分支上,dev 分支是不稳定的,例如 1.0 版本发布时,再把 dev 分支合并到 master 上,在 master 主分支发布 1.0 版本;
|
|
- 每个人干活都在 dev 分支上,dev 分支是不稳定的,例如 1.0 版本发布时,再把 dev 分支合并到 master 上,在 master 主分支发布 1.0 版本;
|
|
|
- 每个人都有自己的分支,时不时的往 dev 分支上合并就行。
|
|
- 每个人都有自己的分支,时不时的往 dev 分支上合并就行。
|