从命令行git转到Tortoise版git

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从命令行git转到Tortoise版git相关的知识,希望对你有一定的参考价值。

阅读前请注意:
本文先学命令行git的,但过不久遇到乱码问题久久不能解决,最后转向tgit。

2016-29

安装

  1. next 下一步
  2. 设置目录
  3. 勾选需要的项:
    • Additional icons是关于图标的设置
    • In the Quick Launch是快速启动图标
    • On the Desktop是桌面快捷方式
    • Windows Explorer integration是资源管理器集成(右键菜单)
      • Git Bash Here是在当前目录运行Git命令行
      • Git GUI Here是在当前目录运行Git原生界面
    • ssociate .git* configuration files with the default text editor是将所有.git开头的文件使用默认文本编辑器打开
    • Associate .sh files to be run with Bash是将所有扩展名为.sh的文件使用Git命令行执行
    • Use a TrueType font in all console windows是在所有命令行(包括Windows系统cmd命令行窗口)中都使用TrueType字体
  4. 是否创建在开始菜单中? Don‘t create... 不创建。
  5. 环境设置
    • Use Git from Git Bash only不会修改系统环境变量,但是Windows系统cmd命令行中无法使用git命令
    • Use Git from the Windows Command Prompt会将git相关程序加入系统环境变量中,使得Windows系统cmd命令行中可以使用git命令
    • Use Git and optional Unix tools from the Windows Command - Prompt会将git相关程序以及一些其他的Unix工具加入系统环境变量,使得Windows系统cmd命令行中可以使用git以及Unix工具
  6. 选择库
    • use the openssl library 使用OpenSSL库
    • use the native windows secure channel library 使用本机Windows安全通道库
  7. 转行规则
    • Checkout Windows-style, commit Unix-style line - endings选项让Git能够自动转换文件中的换行符;签出到本地时转换为Windows下的换行符,提交到服务器时转换为Unix下的换行符
    • Checkout as-is, commit Unix-style line endings选项让Git在签出到本地时不做转换,保留原始文件的换行符;提交到服务器时转换为Unix下的换行符
    • Checkout as-is, commit as-is让Git在签出到本地时和提交到服务器时都不做转换
  8. 使用控制台程序
    • Use MinTTY (the default terminal of MSys2) 选项使用一款叫做MinTTY的软件作为Git命令行,MinTTY是一款模拟Unix系Bash终端的软件。优点是命令记录、可配置字体、可改变窗口大小等等,缺点是可能无法直接运行原Windows下的一些命令行程序
    • Use Windows‘ default console windows选项使用Windows系统cmd命令行来作为Git命令行。优点和缺点正好和上一个选项相反。
  9. 其他选项
    • Enable file system chaching 启用文件缓存
    • Enable Git Credential Manager 启用凭据管理
    • Enable symbolic links 启用符号链接
  10. 等待安装进度。
    • Launch git Bash 现在启动
    • View release notes 查看发行说明
  11. 等待安装完成后,在CMD命令中输入git或者git --version命令查看是否安装成功。

创建版本库

  1. 设置工作目录

    • 在你的工作目录建立一个新的文件夹,比如 git,我就建在桌面。
    • 复制这个 git 的目录路径。
    • 在开始菜单中找到 git cmd (直接cmd中也行)。
      • 为什么使用 git cmd ?因为我对 cmd 熟悉呀(或对 linux 不熟悉)。
      • 在 git 中不但能使用 cmd 的操作方式如复制粘贴,还能使用 cmd 的命令。
        *后面能用 cmd 的我都会用 cmd ,看不起 windows 的请勿喷。
     cd "C:\Users\用户名\Desktop\git"
     rem 切换位置到刚才创建的 git 目录。
     md dir1
     rem 新建文件夹 dir1
     cd dir1
     rem 切换位置到刚才创建的 dir1 目录。
     git init 
     rem 通过git init命令把 dir1 这个目录变成Git可以管理的仓库,现在你可以看到 dir1 下有个
     dir /b /a
     rem 此时可以看到 dir1 目录下有个 .git 隐藏目录,这个目录**不能随便修改**。
    
  2. 添加文件到版本库以及提交文件
    创建两行文本到1.txt。我这里直接使用命令创建,请注意utf8文件头

     echo l1>>1.txt
     echo l2>>1.txt
     git add 1.txt
     rem 添加文件到仓库
     git commit -m "ti_jiao_1"
     rem 提交文件,-m 参数是提交说明。
    
    • Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交。提交之后显示如下信息:

[master (root-commit) e00ea37] ti_jiao_1
1 file changed, 2 insertions(+)
create mode 100644 1.txt

  • 显示更改了1个文件,有2行内容,
  • 为什么要分为 add 添加和 commit 提交两步?因为 add 可以分次添加, commit 是一次性提交。

    copy 1.txt 2.txt
    copy 1.txt 3.txt
    git add 1.txt
    git add 2.txt 3.txt
    git commit -m "ti_jiao_3"
    

[master f1c1590] ti_jiao_3
2 files changed, 4 insertions(+)
create mode 100644 2.txt
create mode 100644 3.txt

  • 经过复制,有了3个文件。然后 add 多次添加,后由 commit 一次性提交。提交结果是成功2个文件,因为我们的 1.txt 之前已提交过了。

  • init 创建仓库 git init

  • add 添加文件 git add 1.txt
  • commit 提交文件 git commit -m "ti_jiao_1"

更改和和查看文件状态

把 1.txt 的第一行 l1 改为 l11 。
使用 git status 查看状态,返回以下信息:

On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)

    modified:   1.txt

no changes added to commit (use "git add" and/or "git commit -a")

上面的信息告诉我们,当前所有的分支 master有更改但没有提交。还告诉我们如何更新要提交的内容如何放弃更改,我们修改了什么文件这个更改没有添加也没有提交以及如何添加和提交
我们还常常希望知道修改了什么地方,那就使用 git diff 来查看差异。

diff --git a/1.txt b/1.txt
index 3582182..78d0700 100644
--- a/1.txt
+++ b/1.txt
@@ -1,2 +1,2 @@
-l1
+l11
l2

--- 表示原文件
+++ 表示新文件
@@ 表示变动位置,也叫差异小结。@@ -1,2 +1,2 @@ 中的 -(减号) 表示原文件,-1 表示原文件的第1行,-1,2 表示原文件的第1行到第2行之间。

  • 表示出现在原文件中的行,也就是被删除的行,减呀
  • 表示出现在新文件中的行,也就是新添加的行,加呀
    空格表示都存在的行,表示没有差异

使用 git add 1.txt 添加文件,git status 再次查看状态,会显示已添加但没有提交的文件,也是提交时会被提交的文件。

On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)

   modified:   1.txt

提交 git commit -m "xiu_gai_1_line" 显示更改了1个文件,有1行添加,1行删除。呵呵,确定行数是没有改变呀:

[master cc508d1] xiu_gai_1_line
1 file changed, 1 insertion(+), 1 deletion(-)

再次查看状态 git status ,返回 On branch master nothing to commit, working tree clean 表示没有需要提交的更改,工作目录整洁。

  • status 查看状态 git status
  • diff 查看差异 git diff

版本跳转

继续把 1.txt 的第一行 l11 改为 l111 ,然后添加并提交,到现在我们已经经过了3次提交。
使用 git log 可以查看提交记录。

commit 038bae478c42f9495d75eaed8ee44b5d3202abe8
Author: Your Name
[email protected]
Date: Sun Mar 26 21技术分享51 2017 +0800

xiu_gai_1_line

commit d4253c4aa8a3abc35390b547b9962c0d32a5647b
Author: Your Name [email protected]
Date: Sun Mar 26 21技术分享21 2017 +0800

ti_jiao_3

commit 739fd22571c153ad80709cb2ccbed4fa9a3ac704
Author: Your Name [email protected]
Date: Sun Mar 26 21技术分享48 2017 +0800

ti_jiao_1

可以看到, git 由近到远的显示了每一次提交的时间、作者、提交ID(commit id,版本号)。
上面才是3次的提交,就占据了很多屏幕。可以加上 --pretty=oneline 参数,只显示版本号和描述,单行显示。

038bae478c42f9495d75eaed8ee44b5d3202abe8 xiu_gai_1_line
d4253c4aa8a3abc35390b547b9962c0d32a5647b ti_jiao_3
739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1

发进行版本跳转,肯定需要知道版本号。在 git 中使用 HEAD 表示当前版本,上一个版本是 HEAD^,上上个是 HEAD^^,上100个是 HEAD~100
下面我们使用 git reset --hard head^^ 跳转到上上版本。

C:\Users\用户名\Desktop\git\dir1>git log --pretty=oneline
038bae478c42f9495d75eaed8ee44b5d3202abe8 xiu_gai_1_line
d4253c4aa8a3abc35390b547b9962c0d32a5647b ti_jiao_3
739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1

C:\Users\用户名\Desktop\git\dir1>dir /b
1.txt
2.txt
3.txt

C:\Users\用户名\Desktop\git\dir1>git reset --hard head^^^^
HEAD is now at 739fd22 ti_jiao_1

C:\Users\用户名\Desktop\git\dir1>git log --pretty=oneline
739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1

C:\Users\用户名\Desktop\git\dir1>dir /b
1.txt

可以看到,我们跳转到了版本ti_jiao_1,文件和第一次提交时一样了,只有1.txt,说明确实跳转成功了。
可能你还注意到,我上面使用了4个^,而不是2个^,这是因为在 cmd 中^符号是用来转义的,也就是说2个^才是1个^。

虽然上面的 log 只有一个了,不过我们还可以使用之前的 ID 进行跳转。

C:\Users\用户名\Desktop\git\dir1>git log --pretty=oneline
739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1

rem 使用 ID 来进行版本跳转,不需要把 ID 完整输入
C:\Users\用户名\Desktop\git\dir1>git reset --hard 038bae478c
HEAD is now at 038bae4 xiu_gai_1_line

C:\Users\用户名\Desktop\git\dir1>git log --pretty=oneline
038bae478c42f9495d75eaed8ee44b5d3202abe8 xiu_gai_1_line
d4253c4aa8a3abc35390b547b9962c0d32a5647b ti_jiao_3
739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1

rem 不要忘记~2也可以回退到上上个版本
C:\Users\用户名\Desktop\git\dir1>git reset --hard head~2
HEAD is now at 739fd22 ti_jiao_1

C:\Users\用户名\Desktop\git\dir1>git log --pretty=oneline
739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1

如果不知道版本号,如何跳转到下一版本呢?
使用 git reflog 可以获得命令执行日志。

C:\Users\用户名\Desktop\git\dir1>git reflog
038bae4 [email protected]{18}: commit: xiu_gai_1_line
d4253c4 [email protected]{19}: commit: ti_jiao_3
739fd22 [email protected]{20}: commit (initial): ti_jiao_1

  • log 查看提交日志 git log 详情, git log --pretty=online 精简。
  • reset 版本跳转 git reset --hard head^ 跳转到上1个版本,head^^head~2 跳转到上2个版本, git reset --hard abcdefg 跳转版本 ID 唯一 abcdefg 开头的版本。
  • reflog 查看命令日志 git reflog

工作区和暂存区

  • 之前我们建立的 dir1 目录里面能看到的内容是工作区,里面隐藏的 .git 目录是 git 的版本库。
  • git init 是创建了一个 .git 目录,也就是版本库。
  • git add 是把文件添加到了暂存区。
  • git commit 是提交暂存区的文件到当前分支。也就是 HEAD 指向的分支 master ,这个 master 是自动创建的。
  • 每次修改就需要进行一次 git add 操作,否则修改不会被提交。

rem 修改第一行为 l11
C:\Users\Administrator\Desktop\git\dir1>type 1.txt
l11
l2

rem 添加到暂存区但没有提交
C:\Users\Administrator\Desktop\git\dir1>git add 1.txt

rem 再次修改为 l111
C:\Users\Administrator\Desktop\git\dir1>type 1.txt
l111
l2

rem 提交
C:\Users\Administrator\Desktop\git\dir1>git commit -m ‘l111‘
[master bdc0a31] ‘l111‘
1 file changed, 1 insertion(+), 1 deletion(-)

rem 查看状态,好像说有更改没有提交,没有添加也没有提交。
C:\Users\Administrator\Desktop\git\dir1>git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)

   modified:   1.txt

Untracked files:
(use "git add ..." to include in what will be committed)

   add
   git
   type

no changes added to commit (use "git add" and/or "git commit -a")

rem 可以使用 git diff ,也可以使用 git diff head -- 1.txt 对比差别,发现 l111 并没有提交,是的,因为我们都没添加到暂存区,而提交的是暂存区的内容。
C:\Users\Administrator\Desktop\git\dir1>git diff head -- 1.txt
diff --git a/1.txt b/1.txt
index 78d0700..644adf5 100644
--- a/1.txt
+++ b/1.txt
@@ -1,2 +1,2 @@
-l11
+l111
l2

如果需要把 l111 提交,需要再次 git add 、git commit 。

  • git diff head -- 对比文件差异 git diff head -- 1.txt

我认为 git diff <file> 等价于 git diff HEAD -- <file>, 都是将工作区内的内容与版本库里面最新版本进行比较
git diff HEAD -- <file> 的意义在于, 第一个参数HEAD是可变的, 也就是可以将工作区内的内容与版本库里指定的任意版本进行比较. 如 git >diff 3628 -- <file>
add之后, 再使用 git diff 将看不到变化, 原因是当前工作区的修改已被添加到暂存区
要查看暂存区内的内容与版本库里面最新版本的差别需要加--cached参数:git diff --cached

2017-04-29 更新

tgit 的安装

感觉好久没有继续学习这个git了。这是为什么呢?
因为上面的学习过程中遇到一个问题,也就是中文乱码的问题。
这个中文乱码,出现在以下情况中:
当提交描述为中文时,提交日志上的中文描述显示乱码。
显示文件差异时,文件中的中文显示乱码。

找了很多文章很多方法,都无法同时完美解决。要么只能解决其一,要么两个都无法解决。

说说我为什么用tgit吧,首先是很好的解决了乱码问题,然后是可以设置操作菜单中文。所以就当一个工具软件用吧,虽然不能用命令行感觉说话都不硬气了唉。

好了不说其他的了,以下说说如何安装使用 tgit 吧。
因为是windows软件,都是一些可视化操作,哪里不会点哪里就可以了。

  1. msygit 首先安装 git ,还是命令行的 git ,使用上面我们安装的 msgit 就可以。
  2. TortoiseGit 然后安装 tgit ,也就是可视化操作 git 的这个东东,安装好这个之后就可以使用了,你看你的右键菜单上多了很多 git 相关的选项。
  3. TortoiseGit-LanguagePack 这个是语言包,不是必须的。,像我一样对E文不了解,我安装了中文语言包。

然后就没有然后了。

 

技术分享
阅读前请注意:
本文先学命令行git的,但过不久遇到乱码问题久久不能解决,最后转向tgit。

2016-29
## 安装
1. next 下一步
2. 设置目录
3. 勾选需要的项:
  - Additional icons是关于图标的设置
  - In the Quick Launch是快速启动图标
  - On the Desktop是桌面快捷方式
  - Windows Explorer integration是资源管理器集成(右键菜单)
      - Git Bash Here是在当前目录运行Git命令行
      - Git GUI Here是在当前目录运行Git原生界面
  - ssociate .git* configuration files with the default text editor是将所有.git开头的文件使用默认文本编辑器打开
  - Associate .sh files to be run with Bash是将所有扩展名为.sh的文件使用Git命令行执行
  - Use a TrueType font in all console windows是在所有命令行(包括Windows系统cmd命令行窗口)中都使用TrueType字体
4. 是否创建在开始菜单中? Don‘t create... 不创建。
5. 环境设置
  - Use Git from Git Bash only不会修改系统环境变量,但是Windows系统cmd命令行中无法使用git命令
  - *Use Git from the Windows Command* Prompt会将git相关程序加入系统环境变量中,使得Windows系统cmd命令行中可以使用git命令
  - Use Git and optional Unix tools from the Windows Command - Prompt会将git相关程序以及一些其他的Unix工具加入系统环境变量,使得Windows系统cmd命令行中可以使用git以及Unix工具
5. 选择库
  - *use the openssl library* 使用OpenSSL库
  - use the native windows secure channel library 使用本机Windows安全通道库
6. 转行规则
  - *Checkout Windows-style*, commit Unix-style line - endings选项让Git能够自动转换文件中的换行符;签出到本地时转换为Windows下的换行符,提交到服务器时转换为Unix下的换行符
  - Checkout as-is, commit Unix-style line endings选项让Git在签出到本地时不做转换,保留原始文件的换行符;提交到服务器时转换为Unix下的换行符
  - Checkout as-is, commit as-is让Git在签出到本地时和提交到服务器时都不做转换
8. 使用控制台程序
  - *Use MinTTY (the default terminal of MSys2)* 选项使用一款叫做MinTTY的软件作为Git命令行,MinTTY是一款模拟Unix系Bash终端的软件。优点是命令记录、可配置字体、可改变窗口大小等等,缺点是可能无法直接运行原Windows下的一些命令行程序
  - Use Windows‘ default console windows选项使用Windows系统cmd命令行来作为Git命令行。优点和缺点正好和上一个选项相反。
8. 其他选项
  - Enable file system chaching 启用文件缓存
  - Enable Git Credential Manager 启用凭据管理
  - Enable symbolic links 启用符号链接
9. 等待安装进度。
  - Launch git Bash 现在启动
  - View release notes 查看发行说明
9. 等待安装完成后,在CMD命令中输入git或者git --version命令查看是否安装成功。

## 创建版本库
1. 设置工作目录
  * 在你的工作目录建立一个新的文件夹,比如 git,我就建在桌面。
  * 复制这个 git 的目录路径。
  * 在开始菜单中找到 git cmd (直接cmd中也行)。
    * 为什么使用 git cmd ?因为我对 cmd 熟悉呀(或对 linux 不熟悉)。
    * 在 git 中不但能使用 cmd 的操作方式如复制粘贴,还能使用 cmd 的命令。
  *后面能用 cmd 的我都会用 cmd ,看不起 windows 的请勿喷。

  ``` dos
    cd "C:\Users\用户名\Desktop\git"
    rem 切换位置到刚才创建的 git 目录。
    md dir1
    rem 新建文件夹 dir1
    cd dir1
    rem 切换位置到刚才创建的 dir1 目录。
    git init 
    rem 通过git init命令把 dir1 这个目录变成Git可以管理的仓库,现在你可以看到 dir1 下有个
    dir /b /a
    rem 此时可以看到 dir1 目录下有个 .git 隐藏目录,这个目录**不能随便修改**。
  ```

2. 添加文件到版本库以及提交文件  
   创建两行文本到1.txt。**我这里直接使用命令创建,请注意utf8文件头**。  
    
  ``` dos
    echo l1>>1.txt
    echo l2>>1.txt
    git add 1.txt
    rem 添加文件到仓库
    git commit -m "ti_jiao_1"
    rem 提交文件,-m 参数是提交说明。
  ```

  * Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交。提交之后显示如下信息:

> [master (root-commit) e00ea37] ti_jiao_1
> 1 file changed, 2 insertions(+)
> create mode 100644 1.txt

  * 显示更改了1个文件,有2行内容,
  * 为什么要分为 add 添加和 commit 提交两步?因为 add 可以分次添加, commit 是一次性提交。
  
  ``` dos
    copy 1.txt 2.txt
    copy 1.txt 3.txt
    git add 1.txt
    git add 2.txt 3.txt
    git commit -m "ti_jiao_3"
  ```

> [master f1c1590] ti_jiao_3
> 2 files changed, 4 insertions(+)
> create mode 100644 2.txt
> create mode 100644 3.txt

  * 经过复制,有了3个文件。然后 add 多次添加,后由 commit 一次性提交。提交结果是成功2个文件,因为我们的 1.txt 之前已提交过了。

  * **init 创建仓库** `git init`  
  * **add 添加文件** `git add 1.txt`  
  * **commit 提交文件** `git commit -m "ti_jiao_1"`  

## 更改和和查看文件状态
把 1.txt 的第一行 l1 改为 l11 。 
使用 `git status` 查看状态,返回以下信息:  

> On branch master
> Changes not staged for commit:
>   (use "git add <file>..." to update what will be committed)
>   (use "git checkout -- <file>..." to discard changes in working directory)
> 
>         modified:   1.txt
> 
> no changes added to commit (use "git add" and/or "git commit -a")

上面的信息告诉我们,`当前所有的分支 master` ,`有更改但没有提交`。还告诉我们`如何更新要提交的内容`和`如何放弃更改`,我们`修改了什么文件`,`这个更改没有添加也没有提交以及如何添加和提交` 。  
我们还常常希望知道修改了什么地方,那就使用 `git diff` 来查看差异。

>diff --git a/1.txt b/1.txt
>index 3582182..78d0700 100644
>--- a/1.txt
>+++ b/1.txt
>@@ -1,2 +1,2 @@
>-l1
>+l11
> l2

--- 表示原文件  
+++ 表示新文件  
@@ 表示变动位置,也叫差异小结。`@@ -1,2 +1,2 @@` 中的 `-(减号)` 表示原文件,`-1` 表示原文件的第1行,`-1,2` 表示原文件的第1行到第2行之间。  
- 表示出现在原文件中的行,也就是被删除的行,减呀  
+ 表示出现在新文件中的行,也就是新添加的行,加呀  
  空格表示都存在的行,表示没有差异  

使用 `git add 1.txt` 添加文件,`git status` 再次查看状态,会显示已添加但没有提交的文件,也是提交时会被提交的文件。

>On branch master
>Changes to be committed:
>  (use "git reset HEAD <file>..." to unstage)
>
>        modified:   1.txt

提交 `git commit -m "xiu_gai_1_line"` 显示更改了1个文件,有1行添加,1行删除。呵呵,确定行数是没有改变呀:    

>[master cc508d1] xiu_gai_1_line
> 1 file changed, 1 insertion(+), 1 deletion(-)

再次查看状态 `git status` ,返回 `On branch master nothing to commit, working tree clean` 表示没有需要提交的更改,工作目录整洁。


* **status 查看状态** `git status`  
* **diff 查看差异** `git diff`  

## 版本跳转
继续把 1.txt 的第一行 l11 改为 l111 ,然后添加并提交,到现在我们已经经过了3次提交。  
使用 `git log` 可以查看提交记录。  

>commit 038bae478c42f9495d75eaed8ee44b5d3202abe8
>Author: Your Name <[email protected]>
>Date:   Sun Mar 26 21:43:51 2017 +0800
>
>    xiu_gai_1_line
>
>commit d4253c4aa8a3abc35390b547b9962c0d32a5647b
>Author: Your Name <[email protected]>
>Date:   Sun Mar 26 21:37:21 2017 +0800
>
>    ti_jiao_3
>
>commit 739fd22571c153ad80709cb2ccbed4fa9a3ac704
>Author: Your Name <[email protected]>
>Date:   Sun Mar 26 21:36:48 2017 +0800
>
>    ti_jiao_1

可以看到, git 由近到远的显示了每一次提交的时间、作者、提交ID(commit id,版本号)。  
上面才是3次的提交,就占据了很多屏幕。可以加上 `--pretty=oneline` 参数,只显示版本号和描述,单行显示。  

>038bae478c42f9495d75eaed8ee44b5d3202abe8 xiu_gai_1_line
>d4253c4aa8a3abc35390b547b9962c0d32a5647b ti_jiao_3
>739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1

发进行版本跳转,肯定需要知道版本号。在 git 中使用 `HEAD` 表示当前版本,上一个版本是 `HEAD^`,上上个是  `HEAD^^`,上100个是 `HEAD~100` 。  
下面我们使用 `git reset --hard head^^` 跳转到上上版本。  

>C:\Users\用户名\Desktop\git\dir1>git log --pretty=oneline
>038bae478c42f9495d75eaed8ee44b5d3202abe8 xiu_gai_1_line
>d4253c4aa8a3abc35390b547b9962c0d32a5647b ti_jiao_3
>739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1
>
>C:\Users\用户名\Desktop\git\dir1>dir /b
>1.txt
>2.txt
>3.txt
>
>C:\Users\用户名\Desktop\git\dir1>git reset --hard head^^^^
>HEAD is now at 739fd22 ti_jiao_1
>
>C:\Users\用户名\Desktop\git\dir1>git log --pretty=oneline
>739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1
>
>C:\Users\用户名\Desktop\git\dir1>dir /b
>1.txt


可以看到,我们跳转到了版本ti_jiao_1,文件和第一次提交时一样了,只有1.txt,说明确实跳转成功了。  
可能你还注意到,我上面使用了4个^,而不是2个^,这是因为在 cmd 中^符号是用来转义的,也就是说2个^才是1个^。 

虽然上面的 log 只有一个了,不过我们还可以使用之前的 ID 进行跳转。  

>C:\Users\用户名\Desktop\git\dir1>git log --pretty=oneline
>739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1
>
>rem 使用 ID 来进行版本跳转,不需要把 ID 完整输入
>C:\Users\用户名\Desktop\git\dir1>git reset --hard 038bae478c
>HEAD is now at 038bae4 xiu_gai_1_line
>
>C:\Users\用户名\Desktop\git\dir1>git log --pretty=oneline
>038bae478c42f9495d75eaed8ee44b5d3202abe8 xiu_gai_1_line
>d4253c4aa8a3abc35390b547b9962c0d32a5647b ti_jiao_3
>739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1
>
>rem 不要忘记~2也可以回退到上上个版本
>C:\Users\用户名\Desktop\git\dir1>git reset --hard head~2
>HEAD is now at 739fd22 ti_jiao_1
>
>C:\Users\用户名\Desktop\git\dir1>git log --pretty=oneline
>739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1

如果不知道版本号,如何跳转到下一版本呢?  
使用 `git reflog` 可以获得命令执行日志。

>C:\Users\用户名\Desktop\git\dir1>git reflog
>038bae4 [email protected]{18}: commit: xiu_gai_1_line
>d4253c4 [email protected]{19}: commit: ti_jiao_3
>739fd22 [email protected]{20}: commit (initial): ti_jiao_1


* **log 查看提交日志** `git log` 详情,   `git log --pretty=online` 精简。  
* **reset 版本跳转** `git reset --hard head^` 跳转到上1个版本,`head^^` 、`head~2` 跳转到上2个版本, `git reset --hard abcdefg` 跳转版本 ID 唯一 abcdefg 开头的版本。  
* **reflog 查看命令日志** `git reflog` 。  

## 工作区和暂存区
- 之前我们建立的 dir1 目录里面能看到的内容是工作区,里面隐藏的 .git 目录是 git 的版本库。
- git init 是创建了一个 .git 目录,也就是版本库。
- git add 是把文件添加到了暂存区。
- git commit 是提交暂存区的文件到当前分支。也就是 HEAD 指向的分支 master ,这个 master 是自动创建的。
- 每次修改就需要进行一次 git add 操作,否则修改不会被提交。

>rem 修改第一行为 l11
>C:\Users\Administrator\Desktop\git\dir1>type 1.txt
>l11
>l2
>
>rem 添加到暂存区但没有提交
>C:\Users\Administrator\Desktop\git\dir1>git add 1.txt
>
>rem 再次修改为 l111
>C:\Users\Administrator\Desktop\git\dir1>type 1.txt
>l111
>l2
>
>rem 提交
>C:\Users\Administrator\Desktop\git\dir1>git commit -m ‘l111‘
>[master bdc0a31] ‘l111‘
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
>rem 查看状态,好像说有更改没有提交,没有添加也没有提交。
>C:\Users\Administrator\Desktop\git\dir1>git status
>On branch master
>Changes not staged for commit:
>  (use "git add <file>..." to update what will be committed)
>  (use "git checkout -- <file>..." to discard changes in working directory)
>
>        modified:   1.txt
>
>Untracked files:
>  (use "git add <file>..." to include in what will be committed)
>
>        add
>        git
>        type
>
>no changes added to commit (use "git add" and/or "git commit -a")
>
>rem 可以使用 git diff ,也可以使用 git diff head -- 1.txt 对比差别,发现 l111 并没有提交,是的,因为我们都没添加到暂存区,而提交的是暂存区的内容。
>C:\Users\Administrator\Desktop\git\dir1>git diff head -- 1.txt
>diff --git a/1.txt b/1.txt
>index 78d0700..644adf5 100644
>--- a/1.txt
>+++ b/1.txt
>@@ -1,2 +1,2 @@
>-l11
>+l111
> l2

如果需要把 l111 提交,需要再次 git add 、git commit 。  
* **git diff head -- 对比文件差异** `git diff head -- 1.txt` 。  

>我认为 `git diff <file>` 等价于 `git diff HEAD -- <file>`, 都是将工作区内的内容与版本库里面最新版本进行比较
>`git diff HEAD -- <file>` 的意义在于, 第一个参数HEAD是可变的, 也就是可以将工作区内的内容与版本库里指定的任意版本进行比较. 如 `git >diff 3628 -- <file>`
>add之后, 再使用 `git diff` 将看不到变化, 原因是当前工作区的修改已被添加到暂存区
>要查看暂存区内的内容与版本库里面最新版本的差别需要加--cached参数:`git diff --cached`

2017-04-29 更新
## tgit 的安装
感觉好久没有继续学习这个git了。这是为什么呢?
因为上面的学习过程中遇到一个问题,也就是中文乱码的问题。
这个中文乱码,出现在以下情况中:
当提交描述为中文时,提交日志上的中文描述显示乱码。
显示文件差异时,文件中的中文显示乱码。

找了很多文章很多方法,都无法同时完美解决。要么只能解决其一,要么两个都无法解决。

说说我为什么用tgit吧,首先是很好的解决了乱码问题,然后是可以设置操作菜单中文。所以就当一个工具软件用吧,虽然不能用命令行感觉说话都不硬气了唉。

好了不说其他的了,以下说说如何安装使用 tgit 吧。
因为是windows软件,都是一些可视化操作,哪里不会点哪里就可以了。
1. `msygit` 首先安装 git ,还是命令行的 git ,使用上面我们安装的 msgit 就可以。
2. `TortoiseGit` 然后安装 tgit ,也就是可视化操作 git 的这个东东,安装好这个之后就可以使用了,你看你的右键菜单上多了很多 git 相关的选项。
3. `TortoiseGit-LanguagePack` 这个是语言包,不是必须的。,像我一样对E文不了解,我安装了中文语言包。

然后就没有然后了。
MD

 

以上是关于从命令行git转到Tortoise版git的主要内容,如果未能解决你的问题,请参考以下文章

使用Tortoise Git进行SVN to GIT迁移

Git的基本命令与Tortoise工具简化Git操作的使用

VSCode自定义代码片段——git命令操作一个完整流程

git tortoise 创建拉取请求 有啥用

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程