------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 commit
或git 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 测底删除分支
------多人协作------