git 学习

------git 安装------

  命令总结 : http://www.cnblogs.com/lixuchun/articles/8927013.html

  学习 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 总结

  linux : sudo apt-get install git

  windows : https://git-scm.com/downloads 下载安装即可

  windows: https://pan.baidu.com/s/1kU5OCOB#list/path=%2Fpub%2Fgit 国内镜像

  安装完成后 Git Bash 打开命令窗口

  因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。

  注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,

  当然也可以对某个仓库指定不同的用户名和Email地址。

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

  创建版本库 repository ,这个目录下的文件都被git管理起来,修改删除都被记录可以追踪,可以在某个时刻还原

  创建一个新的空目录, git init 将此目录变成版本仓库

$ mkdir learngit
$ cd learngit
$ git init

  可以查看到目录中多了.git文件,不要随意修改

  首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,

  网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个

  单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,

  但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,

  但到底改了啥,版本控制系统不知道,也没法知道

  创建一个txt文件到仓库目录下,然后执行add 命令 在进行commit命令 告诉仓库 txt文件已经加入到仓库中了

   add 可以同时添加多分文件 进行一次commit 

git add filea.txt file2 ......
git commit -m (m 为提交的信息,对于提交的修改)

--------时光机---------

  修改txt文件 再进行一次提交

  文件内容为

  修改了多次 可以通过 log 查看修改内容记录

  git log

  如果查看的内容多 显示乱 可以用 --pretty=oneline 参数

  git log --pretty=oneline

  其中黄色大字符串 是 commit id (版本号) ,通过SHA1计算出来的一个非常大的数字

  启动时光机

  Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交版本

  2546c76ae5b......这个版本 (显示为倒叙显示的) 

  HEAD^表示上一个版本 ,HEAD^^表示上两个版本以此类推

  如果上n个版本 n基数比较大时 则可以写成 HEAD~n

  退回上一个版本可以使用 git reset 命令

  再此查看文件内容已经修改到了第二个版本位置 git is free3 消失了

  git log 查看、git is free3版本已经消失了

  如何回到3版本呢,查找到3版本的 commit id 

  git reset --hard commit id 就可以回到3版本

  查看文件已经回到原来3版本了

  如果没有commit id 可以使用 git reflog 命令进行恢复

  git reflog 命令用来记录每一次的命令

  HEAD 指向当前版本 HEAD ^指向前一个版本

  git log 查看提交历史, --pretty=oneline 可以美化查看

  git reflog 查看命令历史,可以帮助回到目标版本

 

------工作区和暂存区------

  工作区就是文件目录, 比如 learn_git 就是一个工作区 

  版本库(Repository)

  工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库

  Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建

  的第一个分支master,以及指向master的一个指针叫HEAD

  git add把文件添加进去,实际上就是把文件修改添加到暂存区

  git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支

  因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,

  现在,git commit就是往master分支上提交更改

  需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

  现在修改 txt文件 再添加一个txt文件 license.txt

  git status 查看一下状态,txt文件被修改,新文件是 Untracked状态

  再用add 命令对文件执行后 再status查看

  操作执行后缓存区的变化:

  

  所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,

  执行git commit就可以一次性把暂存区的所有修改提交到分支

  commit 后 再执行 status, 工作区就是干干净净的了

   之后的版本库变为下面的样子

 

------管理修改------

  为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件

  比如 :

    1,修改 git_add.txt 文件 进行 add 操作

    2,再次进行修改文件

    3,进行commit 操作

  上面操作完成后发现第二次修改文件没有被提交

  因为第一次add 命令 将第一次修改放入到暂存区 第二次没有 所以提交时候只有

  第一次从暂存区提交到了分支上

  可以通过 git diff HEAD -- learn_git.txt 查看工作区和 版本库里最新版本的区别

  每次修改,如果不add到暂存区,那就不会加入到commit

 

------撤销修改------

  git checkout -- git_add.txt 可以丢弃工作区的修改

  命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

    1.readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

    2.readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

  总之,就是让这个文件回到最近一次git commitgit add时的状态。

  git checkout -- file 命令中的 -- 很重要,没有 --,就变成了“切换到另一个分支”的命令

  

  如果已经修改 并且提交到了 暂存区,没有进行 最终提交,以下2步消除修改

    git reset HEAD git_add.txt 可以把暂存区的修改撤销掉(unstage),重新放回工作区

    git checkout --git_add.txt 就可以丢弃工作区的修改

 

------删除文件------

  正常情况下可以直接 rm license.txt 文件

  再git status 查看那些文件被删除了,工作区和版本库现在不相同了

  现在可以接着进行2种选择:

    1,从版本库中删除该文件

      git rm license.txt

      git commit -m "rm license"

    2,可以用checkout --license.txt 将误删的文件恢复到工作区最新版本

  git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,

  你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

 

------远程仓库------

  你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,

  GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作

  1,登录github 找到 Create a new repo 按钮,并且创建一个仓库

  GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,

  把本地仓库的内容推送到GitHub仓库

    git remote add origin git@github.com:lixuchun/learn_git.git

  

  把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

  添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

  由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的

  master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

  只要之后本地做了提交可以执行: 

    git push origin master 把本地修改内容推向 github

  总结:

    要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

    git push -u origin master 第一次推送master分支的所有内容

  git remote -v 查看本地仓库

  再添加一个 本地名称为origin1的远程仓库

    git remote add origin1 git@github.com:lixuchun/learn_git.git

    git remote -v 查看当前本地仓库

    取消origin1 的远程连接

    git remote remove origin1

    操作显示效果如下:

  分布式版本系统最大好处是不需要连网,不需要考虑远程库的存在 ,本地修改,有网时本地推送到就好了 非常方便

  从远程库克隆到本地

  

 

------分支管理------

  创建合并分支

  HEAD 指向master master 指向 最新的提交 从A 移动到 D

 

 

   实例:先创建dev 分支

    git checkout -b dev  

  -b 表示创建并且切换 相当以下2条命令

    git branch dev  创建dev 分支

    git checkout dev  切换到dev分支

    git branch 列出所有分支

  修改本地 git_add.txt 文件 然后提交

  提交后切换会master分支

  git checkout master 

  之后 将 dev 的改变内容 merge 到 master上

    git merge dev

  

  git branch -d dev

  删除后查看branch 只剩下 master 分支了

 

   总结:

------解决冲突------

  创建一个新的分支:

    git checkout -b feature1

  修改 git_add.txt 文件 添加最后一行

    test_chong_tu_01

    git add git_add.txt

    git commit -m "test chong_tu 01"

  切换回master

    git checkout master

  修改git_add文件 最后一行  

    test chong_tu 01 master

    git add git_add.txt

    git commit -m "test chong_tu 01 master"

  重新进行 merge

    git merge feature1

  发现问题 查看git_add.txt内容

  Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后保存:

  再次进行add commit 操作

   最后删除feature1 

    git branch -d feature1

  到此 冲突已经解决了 需要手动修改冲突文件 手动修改冲突文件

 

 ------分支管理策略------

  创建新分支 dev

    git checkout -b dev

  修改 git_add.txt 并且提交到一个新的 commit 中

    git add git_add.txt

    git commit -m "test no fast forward"

  之后切换回 master:

    git checkout master

  准备合并dev 分支 并且使用 --no-ff 参数, 表示 禁用 Fast forward:

    git merge --no-ff -m "merge without Fast forward" dev

    因为此次会生成一个新的commit 所以加上 -m 参数, 讲commit 描述加入进去

  最后 用 git log 查看分支历史

    git log --graph --pretty=oneline --abbrev-commit

*   7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
*   59bc1cb conflict fixed
...

   可以看到不适用 Fast forward 模式 merge 后结果如下图所示:

  bug 分支

  git 提供了一个 stash 功能,可以把当前工作存储起来,等忙完紧急工作后再进行恢复

    git stash

  假定需要在master分支上修复, 就从master分支创建临时分支

    git checkout master   切换到 master分支

    git checkout -b issue-101 创建 bug 分支

  然后进行bug修复

    git add ...

    git commit -m ...

  修复完成后切换到master分支上 进行合并 最后删除 issue-101

    git checkout master

    git merge --no-ff -m "merged bug fix 101" issue-101

    git branch -d issue-101

    git checkout dev

    git status

   切换回dev 分支后,刚才的工作 stash 可以通过 git stash list 进行查看

     git stash list

  也可以进行多次stash 恢复的时候用 git stash list 查看 恢复指定stash :

    git stash apply stash@{}

 

------Feature分支------

  开发新功能 新建一个feature分支

    git checkout -b feature

  到新的feature 分支进行开发

    git add ...

    git commit ...

  没有进行merge 发现新分支不需要了 要进行删除

    git branch -D feature 测底删除分支

 

------多人协作------

 

  

 

posted @ 2018-04-24 11:07  土豆牛贼烦人  阅读(146)  评论(0编辑  收藏  举报