• git 学习


    一、windows安装git

      1、从Git官网直接下载安装程序,然后按默认选项安装即可,

      2、因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。因此安装完成后,还需要最后一步设置,在命令行输入

    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"

      3、创建git版本库,版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

        a、首先在电脑D盘创建文件夹gitlearn,然后右键打开git bash here

        b、创建对应目录

    Administrator@PC201704271057 MINGW64 /d/gitlearn
    $ pwd
    /d/gitlearn
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn
    $ mkdir learngit
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn
    $ cd learngit/
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit
    $ pwd
    /d/gitlearn/learngit

        c、第二步,通过git init命令把这个目录变成Git可以管理的仓库

    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit
    $ git init
    Initialized empty Git repository in D:/gitlearn/learngit/.git/
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ ls
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ ls -la
    total 4
    drwxr-xr-x 1 Administrator 197121 0 一月  9 14:25 ./
    drwxr-xr-x 1 Administrator 197121 0 一月  9 14:20 ../
    drwxr-xr-x 1 Administrator 197121 0 一月  9 14:25 .git/

        d、版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。

      4、开始测试

        a、创建一个名字叫readme.txt文件,内容如下

    Git is a version control system.
    Git is free software.

         b、第一步,用命令git add告诉Git,把文件添加到仓库

    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git add readme.txt

        c、第二步,用命令git commit告诉Git,把文件提交到仓库

    $ git commit -m "wrote a readme file"
    [master (root-commit) 7cf9237] wrote a readme file
     1 file changed, 2 insertions(+)
     create mode 100644 readme.txt

        d、commit可以一次提交很多文件,所以你可以多次add不同的文件

    $ git add file1.txt
    $ git add file2.txt file3.txt
    $ git commit -m "add 3 files."

    二、git时光穿梭

      1、git status,将一中readme.txt改成如下内容,然后运行git status查看结果

    Git is a distributed version control system.
    Git is free software.
    $ 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:   readme.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")

      git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

      2、git diff,顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从下面的命令输出看到,我们在第一行添加了一个distributed单词

    $ git diff readme.txt
    warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory.
    diff --git a/readme.txt b/readme.txt
    index 46d49bf..9247db6 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -1,2 +1,2 @@
    -Git is a version control system.
    +Git is a distributed version control system.
     Git is free software.

      3、将修改后的文件提交到仓库查看状态

    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git add readme.txt
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git commit -m "add distributed"
    [master 49fd6ee] add distributed
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git status
    On branch master
    nothing to commit, working tree clean

      4、版本回退

        a、git log查看git 操作,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数

    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git log
    commit 49fd6ee08bb40941995ef262d18bdb41cd096352 (HEAD -> master)
    Author: lipingchang <1209989516@qq.com>
    Date:   Wed Jan 9 16:37:36 2019 +0800
    
        add distributed
    
    commit 7cf92375c84913da3b8050080a2850730cc244a6
    Author: lipingchang <1209989516@qq.com>
    Date:   Wed Jan 9 16:16:59 2019 +0800
    
        wrote a readme file
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git log --pretty=oneline
    49fd6ee08bb40941995ef262d18bdb41cd096352 (HEAD -> master) add distributed
    7cf92375c84913da3b8050080a2850730cc244a6 wrote a readme file

        b、版本回退,在Git中,用HEAD表示当前版本,也就是最新的提交49fd6...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

        c、git reset,我们要把当前版本add distributed回退到上一个版本wrote a readme file,就可以使用git reset

    $ git reset --hard HEAD^
    HEAD is now at 7cf9237 wrote a readme file
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git log
    commit 7cf92375c84913da3b8050080a2850730cc244a6 (HEAD -> master)
    Author: lipingchang <1209989516@qq.com>
    Date:   Wed Jan 9 16:16:59 2019 +0800
    
        wrote a readme file
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ cat readme.txt
    Git is a version control system.
    Git is free software.

        会发现看不到最新的add distributed这个版本了,此时可以通过回退commit id 来实现版本切换,版本号没必要写全,前几位就可以了,Git会自动去找

    $ git reset --hard 49fd6e
    HEAD is now at 49fd6ee add distributed
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    
    $ git log
    commit 49fd6ee08bb40941995ef262d18bdb41cd096352 (HEAD -> master)
    Author: lipingchang <1209989516@qq.com>
    Date:   Wed Jan 9 16:37:36 2019 +0800
    
        add distributed
    
    commit 7cf92375c84913da3b8050080a2850730cc244a6
    Author: lipingchang <1209989516@qq.com>
    Date:   Wed Jan 9 16:16:59 2019 +0800
    
        wrote a readme file
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ cat readme.txt
    Git is a distributed version control system.
    Git is free software.

         d、Git提供了一个命令git reflog用来记录你的每一次命令,如果忘记版本commit id 就可以使用

    $ git reflog
    49fd6ee (HEAD -> master) HEAD@{0}: reset: moving to 49fd6e
    7cf9237 HEAD@{1}: reset: moving to HEAD^
    49fd6ee (HEAD -> master) HEAD@{2}: commit: add distributed
    7cf9237 HEAD@{3}: commit (initial): wrote a readme file

       5、git工作区和暂存区,前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的,第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区,第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。因此Git是这样跟踪修改的,每次修改,如果不用git add到暂存区,那就不会加入到commit中。

      6、撤销修改

         a、若已经在文件中添加了相应的内容还没有git add ,使用git checkout -- 文件名即可,git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令

    $ echo "bbb" >> readme.txt
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ cat readme.txt
    Git is a distributed version control system.
    Git is free software.
    aaa
    bbb
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git checkout -- readme.txt
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ cat readme.txt
    Git is a distributed version control system.
    Git is free software.
    aaa

        b、若已经修改了相应内容并且git add了需要先执行 git reset  HEAD 文件名,然后再执行git checkout -- 文件名即可

    $ echo "bbb" >> readme.txt
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git add readme.txt
    warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory.
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ cat readme.txt
    Git is a distributed version control system.
    Git is free software.
    aaa
    bbb
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git reset HEAD readme.txt
    Unstaged changes after reset:
    M       readme.txt
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ 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:   readme.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ git checkout -- readme.txt
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit (master)
    $ cat readme.txt
    Git is a distributed version control system.
    Git is free software.
    aaa

       7、删除文件

        a、创建了一个文件test.txt 然后git add 了,此时要删除这个文件有如下方式。

          1)、首先删除文件,rm test.txt ,然后在版本库中删除,git rm test.txt 并且 git commit -m "remove test.txt"

        b、创建了一个文件test.txt然后git add 了,此时误删除了这个文件,要恢复的话只需要 git checkout -- 文件名 就行了。

    三、远程仓库

      1、要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;关联后,使用命令git push -u origin master第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

      2、拉取远程仓库 git clone git@github.com:lwx516294/gitskills.git

    四、分支管理

      1、我们创建dev分支,然后切换到dev分支,git checkout命令加上-b参数表示创建并切换,git checkout -b dev相当于以下两条命令

    $ git branch dev
    $ git checkout dev
    Switched to branch 'dev'

      2、git branch命令会列出所有分支,当前分支前面会标一个*

    $ git checkout -b dev
    Switched to a new branch 'dev'
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (dev)
    $ git branch
    * dev
      master
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (dev)

      3、在dev 分支创建 aaa.txt文件并提交到dev分支然后合并到master分支上

    $ echo "cccddd" >> dev.txt
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (dev)
    $ ls
    dev.txt  README.md
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (dev)
    $ git add dev.txt
    warning: LF will be replaced by CRLF in dev.txt.
    The file will have its original line endings in your working directory.
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (dev)
    $ git commit -m "dev.txt"
    [dev fa2c27e] dev.txt
     1 file changed, 1 insertion(+)
     create mode 100644 dev.txt
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (dev)
    $ git checkout master
    Switched to branch 'master'
    Your branch is up to date with 'origin/master'.
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (master)
    $ ls
    README.md
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (master)
    $ git merge dev
    Updating 1b4efe5..fa2c27e
    Fast-forward
     dev.txt | 1 +
     1 file changed, 1 insertion(+)
     create mode 100644 dev.txt
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (master)
    $ ls
    dev.txt  README.md

      4、删除分支 git branch -d dev

    $ git branch -d dev
    Deleted branch dev (was fa2c27e).
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (master)
    $ git branch
    * master

      4、解决冲突,若在dev 分支上修改了文件dev.txt 然后又切换到master 分支修改了dev.txt 文件然后要将dev 分支合并到master分支就会产生冲突。Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后保存:

    $ cat dev.txt
    cccddd
    <<<<<<< HEAD
    ddd
    =======
    aaa
    >>>>>>> dev
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (master|MERGING)

        此时我们可以手动删除master上修改的内容然后提交,修改后变为

    cccddd
    aaa

        用带参数的git log也可以看到分支的合并情况:

    $ git log --graph --pretty=oneline --abbrev-commit
    *   ee1ac8c (HEAD -> master) dev merge
    |
    | * 9996444 (dev) aaa
    * | e3e8870 ddd
    |/
    * fa2c27e dev.txt
    * 1b4efe5 (origin/master, origin/HEAD) Initial commit

      5、分支管理策略,通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息,如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

    $ git merge --no-ff -m "merge with no-ff" dev
    Merge made by the 'recursive' strategy.
     dev.txt | 1 +
     1 file changed, 1 insertion(+)
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (master)
    $ git log
    commit ade6f2acb64e85d1a2db28b18415519365aaa524 (HEAD -> master)
    Merge: ee1ac8c ef25ce3
    Author: lipingchang <1209989516@qq.com>
    Date:   Thu Jan 10 11:30:07 2019 +0800
    
        merge with no-ff
    
    commit ef25ce3bd6a29c1d15faf4b8894e10e8a81d30fc (dev)
    Author: lipingchang <1209989516@qq.com>
    Date:   Thu Jan 10 11:29:16 2019 +0800
    
        aaa
    
    commit ee1ac8c2d1c0e31d3bc0844b2933fda4530bde85
    Merge: e3e8870 9996444
    Author: lipingchang <1209989516@qq.com>
    Date:   Thu Jan 10 11:10:20 2019 +0800
    
        dev merge
    
    commit e3e8870d7d26636dfe2019964f653aa559ffba8a
    Author: lipingchang <1209989516@qq.com>
    Date:   Thu Jan 10 10:55:27 2019 +0800
    
        ddd
    
    commit 9996444daceee4e4d02ea0b5728caccd69e49844
    Author: lipingchang <1209989516@qq.com>
    Date:   Thu Jan 10 10:54:39 2019 +0800
    
        aaa
    
    commit fa2c27ed7038c808e9a61e0d4bf2c1ac93a2298e
    Author: lipingchang <1209989516@qq.com>
    Date:   Thu Jan 10 10:46:52 2019 +0800
    
        dev.txt
    
    commit 1b4efe5d1b544343c0006e7b28331f2a8455b741 (origin/master, origin/HEAD)
    Author: Presley <35398877+lwx516294@users.noreply.github.com>
    Date:   Thu Jan 10 10:30:51 2019 +0800
    
        Initial commit

        合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

       6、删除还没有合并的分支可以通过git branch -D 分支名 强行删除。

      7、多人协作

        a、查看远程库信息,使用git remote -v

    $ git remote -v
    origin  git@github.com:lwx516294/gitskills.git (fetch)
    origin  git@github.com:lwx516294/gitskills.git (push)

          上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

        b、本地新建的分支如果不推送到远程,对其他人就是不可见的;

        c、从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

        d、在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

        e、建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

        f、从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

    五、标签管理

      1、给当前分支打tag,git tag <name>,查看所有的tag用git tag命令

    $ git tag v1.0
    $ git tag
    v1.0

      2、给提交的commit id打tag

    $ git log --pretty=oneline --abbrev-commit
    392899f (HEAD -> master, tag: v1.0, origin/master, origin/HEAD) pull
    cb3a4ee test
    6ec19f6 xiugai
    ade6f2a merge with no-ff
    ef25ce3 (origin/dev, dev) aaa
    ee1ac8c dev merge
    e3e8870 ddd
    9996444 aaa
    fa2c27e dev.txt
    1b4efe5 Initial commit
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (master)
    $ git tag v0.9 fa2c27e

      3、注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息

    $ git show v0.9
    commit fa2c27ed7038c808e9a61e0d4bf2c1ac93a2298e (tag: v0.9)
    Author: lipingchang <1209989516@qq.com>
    Date:   Thu Jan 10 10:46:52 2019 +0800
    
        dev.txt
    
    diff --git a/dev.txt b/dev.txt
    new file mode 100644
    index 0000000..af530c2
    --- /dev/null
    +++ b/dev.txt
    @@ -0,0 +1 @@
    +cccddd

      4、还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

    $ git tag -a v0.1 -m "version 0.1 released" e3e8870
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (master)
    $ git tag
    v0.1
    v0.9
    v1.0
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (master)
    $ git show v0.1
    tag v0.1
    Tagger: lipingchang <1209989516@qq.com>
    Date:   Thu Jan 10 13:49:56 2019 +0800
    
    version 0.1 released
    
    commit e3e8870d7d26636dfe2019964f653aa559ffba8a (tag: v0.1)
    Author: lipingchang <1209989516@qq.com>
    Date:   Thu Jan 10 10:55:27 2019 +0800
    
        ddd
    
    diff --git a/dev.txt b/dev.txt
    index af530c2..c65caeb 100644
    --- a/dev.txt
    +++ b/dev.txt
    @@ -1 +1,2 @@
     cccddd
    +ddd

      5、删除标签 git tag -d 标签名,因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

    $ git tag -d v0.1
    Deleted tag 'v0.1' (was 15a0042)

      6、要推送某个标签到远程,使用命令git push origin <tagname>

    $ git push origin v1.0
    Total 0 (delta 0), reused 0 (delta 0)
    To github.com:lwx516294/gitskills.git
     * [new tag]         v1.0 -> v1.0

      7、一次性推送全部尚未推送到远程的本地标签

    $ git push origin --tags
    Total 0 (delta 0), reused 0 (delta 0)
    To github.com:michaelliao/learngit.git
     * [new tag]         v0.9 -> v0.9

      8、如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除,然后,从远程删除。删除命令也是push

    $ git tag -d v1.0
    Deleted tag 'v1.0' (was 392899f)
    
    Administrator@PC201704271057 MINGW64 /d/gitlearn/learngit/gitskills (master)
    $ git push origin :refs/tags/v1.0
    To github.com:lwx516294/gitskills.git
     - [deleted]         v1.0

        

  • 相关阅读:
    Codeforces
    Codeforces
    SCUT
    Codeforces
    Codeforces
    poj 2229 Sumsets(类似于n的m划分)
    poj 1742 Coins(多重背包)
    hdu 2159FATE(完全背包)
    NOIP 普及组 2014 比例简化
    2018.10.2浪在ACM 集训队第三次测试赛
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/10244183.html
Copyright © 2020-2023  润新知