• 从命令行git转到Tortoise


    阅读前请注意:
    本文先学命令行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用户名Desktopgit"
       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@example.com
    Date: Sun Mar 26 21:43:51 2017 +0800

    xiu_gai_1_line

    commit d4253c4aa8a3abc35390b547b9962c0d32a5647b
    Author: Your Name email@example.com
    Date: Sun Mar 26 21:37:21 2017 +0800

    ti_jiao_3

    commit 739fd22571c153ad80709cb2ccbed4fa9a3ac704
    Author: Your Name email@example.com
    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用户名Desktopgitdir1>git log --pretty=oneline
    038bae478c42f9495d75eaed8ee44b5d3202abe8 xiu_gai_1_line
    d4253c4aa8a3abc35390b547b9962c0d32a5647b ti_jiao_3
    739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1

    C:Users用户名Desktopgitdir1>dir /b
    1.txt
    2.txt
    3.txt

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

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

    C:Users用户名Desktopgitdir1>dir /b
    1.txt

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

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

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

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

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

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

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

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

    C:Users用户名Desktopgitdir1>git reflog
    038bae4 HEAD@{18}: commit: xiu_gai_1_line
    d4253c4 HEAD@{19}: commit: ti_jiao_3
    739fd22 HEAD@{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:UsersAdministratorDesktopgitdir1>type 1.txt
    l11
    l2

    rem 添加到暂存区但没有提交
    C:UsersAdministratorDesktopgitdir1>git add 1.txt

    rem 再次修改为 l111
    C:UsersAdministratorDesktopgitdir1>type 1.txt
    l111
    l2

    rem 提交
    C:UsersAdministratorDesktopgitdir1>git commit -m 'l111'
    [master bdc0a31] 'l111'
    1 file changed, 1 insertion(+), 1 deletion(-)

    rem 查看状态,好像说有更改没有提交,没有添加也没有提交。
    C:UsersAdministratorDesktopgitdir1>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:UsersAdministratorDesktopgitdir1>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用户名Desktopgit"
        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@example.com>
    >Date:   Sun Mar 26 21:43:51 2017 +0800
    >
    >    xiu_gai_1_line
    >
    >commit d4253c4aa8a3abc35390b547b9962c0d32a5647b
    >Author: Your Name <email@example.com>
    >Date:   Sun Mar 26 21:37:21 2017 +0800
    >
    >    ti_jiao_3
    >
    >commit 739fd22571c153ad80709cb2ccbed4fa9a3ac704
    >Author: Your Name <email@example.com>
    >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用户名Desktopgitdir1>git log --pretty=oneline
    >038bae478c42f9495d75eaed8ee44b5d3202abe8 xiu_gai_1_line
    >d4253c4aa8a3abc35390b547b9962c0d32a5647b ti_jiao_3
    >739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1
    >
    >C:Users用户名Desktopgitdir1>dir /b
    >1.txt
    >2.txt
    >3.txt
    >
    >C:Users用户名Desktopgitdir1>git reset --hard head^^^^
    >HEAD is now at 739fd22 ti_jiao_1
    >
    >C:Users用户名Desktopgitdir1>git log --pretty=oneline
    >739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1
    >
    >C:Users用户名Desktopgitdir1>dir /b
    >1.txt
    
    
    可以看到,我们跳转到了版本ti_jiao_1,文件和第一次提交时一样了,只有1.txt,说明确实跳转成功了。  
    可能你还注意到,我上面使用了4个^,而不是2个^,这是因为在 cmd 中^符号是用来转义的,也就是说2个^才是1个^。 
    
    虽然上面的 log 只有一个了,不过我们还可以使用之前的 ID 进行跳转。  
    
    >C:Users用户名Desktopgitdir1>git log --pretty=oneline
    >739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1
    >
    >rem 使用 ID 来进行版本跳转,不需要把 ID 完整输入
    >C:Users用户名Desktopgitdir1>git reset --hard 038bae478c
    >HEAD is now at 038bae4 xiu_gai_1_line
    >
    >C:Users用户名Desktopgitdir1>git log --pretty=oneline
    >038bae478c42f9495d75eaed8ee44b5d3202abe8 xiu_gai_1_line
    >d4253c4aa8a3abc35390b547b9962c0d32a5647b ti_jiao_3
    >739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1
    >
    >rem 不要忘记~2也可以回退到上上个版本
    >C:Users用户名Desktopgitdir1>git reset --hard head~2
    >HEAD is now at 739fd22 ti_jiao_1
    >
    >C:Users用户名Desktopgitdir1>git log --pretty=oneline
    >739fd22571c153ad80709cb2ccbed4fa9a3ac704 ti_jiao_1
    
    如果不知道版本号,如何跳转到下一版本呢?  
    使用 `git reflog` 可以获得命令执行日志。
    
    >C:Users用户名Desktopgitdir1>git reflog
    >038bae4 HEAD@{18}: commit: xiu_gai_1_line
    >d4253c4 HEAD@{19}: commit: ti_jiao_3
    >739fd22 HEAD@{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:UsersAdministratorDesktopgitdir1>type 1.txt
    >l11
    >l2
    >
    >rem 添加到暂存区但没有提交
    >C:UsersAdministratorDesktopgitdir1>git add 1.txt
    >
    >rem 再次修改为 l111
    >C:UsersAdministratorDesktopgitdir1>type 1.txt
    >l111
    >l2
    >
    >rem 提交
    >C:UsersAdministratorDesktopgitdir1>git commit -m 'l111'
    >[master bdc0a31] 'l111'
    > 1 file changed, 1 insertion(+), 1 deletion(-)
    >
    >rem 查看状态,好像说有更改没有提交,没有添加也没有提交。
    >C:UsersAdministratorDesktopgitdir1>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:UsersAdministratorDesktopgitdir1>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-凭证-凭证助手中选择当前windows用户。

    如何把本地的库上传到远程?
    1. 上传之前先在远程创建项目 new repository
    1. 不要创建任何文件,也就是不勾选 Initialize this repository with a README
    1. 这样得到项目名的地址,如 https://github.com/daysme/name.git (.git后缀可选)
    1. 复制地址到 tgit 的【推送-目标-其他URL】中,确定即可。

    ## 从远程同步下来的话
    拉取和获取的区别:
    Pull和Fetch的区别:
    Pull会把指定分支的代码从远端下载到本地,并进行merge(合并)操作
    Fetch会把远端所有代码包括分支下载到本地,但不merge(合并)

  • 相关阅读:
    PowerDesigner快捷键
    Android 的开源电话/通讯/IM聊天项目全集
    Android ContentProvider完整案例
    Android中观察者模式的升入理解
    Android中Socket大文件断点上传
    Storm概念学习系列之Tuple元组(数据载体)
    开始使用storm
    Storm概念学习系列之storm的功能和三大应用
    Storm概念学习系列之storm的特性
    Storm概念学习系列之storm核心组件
  • 原文地址:https://www.cnblogs.com/daysme/p/6784965.html
Copyright © 2020-2023  润新知