git简明教程

史上最简单的GIT简明教程
--------------------------------------------------------------------------------------------
date:20140716
created by jesse
system_os:CentOS 6.2x64
git url
https://www.kernel.org/pub/software/scm/git/
http://git-scm.com/downloads

支持的协议:
git://
http://
https://
user@server:/path.git
--------------------------------------------------------------------------------------------
1:git安装

#yum安装
yum install -y git

#设置GIT 以便进行用户修改跟踪 以及结果显示色彩
git config --global user.name "zhangluya"
git config --global user.email "zhangluya1987@gmail.com"
#git config --global color.ui true
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"


#查看已经做的全局配置
git config --list

源码包安装方式:
wget https://www.kernel.org/pub/software/scm/git/git-2.0.1.tar.gz
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc* perl perl-devel
tar zvfx git-2.0.1.tar.gz 
cd git-2.0.1
make prefix=/usr/local/git all
make prefix=/usr/local/git install
cd ..

2.创建版本库
mkdir git
cd git/
git init

#添加并提交文件 -m 后面写说明 -a参数可以直接编辑
git add readme.txt 
git commit -m "git init v1.0" 

3.如果git status告诉你有文件被修改过,用git diff可以查看修改内容
[root@jesse git]# git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 45e6e5c..274860d 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
 git init v1.0 2014-07-17 17:27
 git add 2 files v1.1
+git diff test v1.3


4:版本回退
在Git中,用HEAD表示当前版本,也就是最新的提交.
上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100.
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向需要回退的版本:

#回退到上个版本
[root@git git]# git reset --hard HEAD^
HEAD is now at 8261d99 readme.txt add a line

#查看确认 已经回退到上个版本了 git log也看不到上条信息了
[root@lamp git]# git log --pretty=oneline
8261d99402702e3b6c9e7a54a9fba2b8781ebe9a readme.txt add a line
a41a9c889f8a5450953675acf21274700965e803 add 2 files
62de30a512766147733ebc2cee235384c4862e65 git init v1.0

[root@lamp git]# cat readme.txt 
git init v1.0 2014-07-17 17:27
git add 2 files v1.1

如果后悔了 还想回退到之前的版本:
只要记得之前的commit id即可回退回去
[root@lamp git]# git reset --hard fe5f6e8
HEAD is now at fe5f6e8 git diff test

#git log 查看提交信息
[root@lamp git]# git log --pretty=oneline
fe5f6e8187e4c6b579e7d9af6c46bc1e43be098b git diff test
8261d99402702e3b6c9e7a54a9fba2b8781ebe9a readme.txt add a line
a41a9c889f8a5450953675acf21274700965e803 add 2 files
62de30a512766147733ebc2cee235384c4862e65 git init v1.0

#已经回退回去了
[root@lamp git]# cat readme.txt 
git init v1.0 2014-07-17 17:27
git add 2 files v1.1
git diff test v1.3

#git reflog查看命令历史
[root@lamp git]# git reflog
fe5f6e8 HEAD@{0}: fe5f6e8: updating HEAD
a41a9c8 HEAD@{1}: a41a9c8: updating HEAD
fe5f6e8 HEAD@{2}: fe5f6e8: updating HEAD
8261d99 HEAD@{3}: HEAD^: updating HEAD
fe5f6e8 HEAD@{4}: commit: git diff test
8261d99 HEAD@{5}: commit: readme.txt add a line
a41a9c8 HEAD@{6}: commit: add 2 files
62de30a HEAD@{7}: commit (initial): git init v1.0


5:工作区和暂存区
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用"git add"把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用"git commit"提交更改,实际上就是把暂存区的所有内容提交到当前分支;
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,commit就是往master分支上提交更改.
可以简单理解为,需要提交的文件修改通通放到暂存区,然后一次性提交暂存区的所有修改.


#查看工作区和版本库里的差别:
[root@lamp git]# git diff HEAD readme.txt 
diff --git a/readme.txt b/readme.txt
index 274860d..e97e868 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,4 @@
 git init v1.0 2014-07-17 17:27
 git add 2 files v1.1
 git diff test v1.3
+git HEAD diff -- readme.txt


6:撤销修改和删除
#撤销修改 中间是 -- 这个不要忘记 撤销修改的是未提交到暂存区之前的
git checkout -- readme.txt

#删除文件从版本库中
git rm file.txt
git commit -m "remove file.txt"

#删除完后想要撤销回来
[root@lamp git]# git reflog
e201e55 HEAD@{0}: commit: remove 1.txt
fe5f6e8 HEAD@{1}: fe5f6e8: updating HEAD

[root@lamp git]# git reset --hard e201e55
HEAD is now at e201e55 remove 1.txt


7远程仓库:
git remote add origin git@github.com:jesse/git.git
git push -u origin master #第一次提交时使用-u参数

由于远程库是空的,第一次推送master分支加上了-u参数,Git不但会把本地的master分支内容推送
的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者
拉取时就可以简化命令.

#以后操作简化如下
git push origin master

远程克隆:
git clone git@github.com:jesse/git.git

8:分支管理
git checkout -b dev_01 #创建并切换到开发分支

#相当于如下操作
git branch dev_01 #创建分支
git checkout dev_01 #切换分支
git branch命令会列出所有分支,当前分支前面会标一个*号.

#合并分支
git checkout master  #切换到主分支
git merge dev_01     #将开发分子和合并到master分支

#删除分支:
git branch -d dev_01

#解决冲突
[root@lamp git]# vi readme.txt 

<<<<<<< HEAD   #当前分支
git merge test 1
=======
git merge test  #开发分支
>>>>>>> dev_01
git add branch dev_01 test
git init v1.0 2014-07-17 17:27
git add 2 files v1.1
git diff test v1.3

此处收工合并冲突后默认认为已经处理最好是修改成和两边一直 然后互相merge下


#带参数的分支查看情况
[root@lamp git]# git log --graph --pretty=oneline --abbrev-commit
*   63e2c04 remove git merge test 1
|  
| * 9da0c9f git merge test
* | bc5e9e3 merge test 1 master
|/  
* eeba8b3 git add branch dev_01 test
* fe5f6e8 git diff test
* 8261d99 readme.txt add a line
* a41a9c8 add 2 files
* 62de30a git init v1.0

#--no-ff 模式的merge git log可以看到相关的更新
git merge --no-ff -m "merge with --no-ff master" dev_01

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

8:BUG分支管理
#暂时将工作区和暂存区冷藏起来
[root@git git]# git stash
Saved working directory and index state WIP on dev_01: ff993b6 merge with no-ff
HEAD is now at ff993b6 merge with no-ff

#查看冷藏起来的都有哪些
[root@lamp git]# git stash list
stash@{0}: WIP on dev_01: ff993b6 merge with no-ff

#恢复冷藏文件
git stash apply stash@{0} #恢复之后不删除
git stash pop             #恢复的同时并删除

#删除冷藏列表:
git stash drop

#如果要丢弃一个没有被合并过的分支,可以通过
git branch -D name 强行删除

#查看远程库信息
git remote -v

#推送分支
git push orign master


9:标签管理
git tag v1.0 #给当前提交打便签
git tag v1.1 jds7s8s #针对指定commit id 打标签
git tag #查看所有标签
git show v1.0 #查看标签信息

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a v0.1 -m "version 0.1 released" 3628164

还可以通过-s用私钥签名一个标签 一般不用
git tag -s v0.2 -m "signed version 0.2 released" fec145a

删除标签:
git tag -d v1.0
因为创建的标签都只存储在本地 不会自动推送到远程所以,打错的标签可以在本地安全删除.
如果要推送某个标签到远程,使用命令git push origin tagname:

#一次性推送全部尚未推送到远程的本地标签:
git push origin --tags

#如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v0.9
Deleted tag 'v0.9' (was 6224937)
然后,从远程删除。删除命令也是push,但是格式如下:

git push origin :refs/tags/v0.9
To git@github.com:jesse/learngit.git
 - [deleted]         v0.9


忽略特殊文件:
.gitignore

别名设置:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch



git服务器搭建简化步骤:
yum install -y git
useradd git
mkidr git && cd git
git init --bare sample.git
chown -R git:git sample.git
修改git 登陆shell为
git:x:500:500::/home/git:/usr/bin/git-shell


[root@console git_learn]# git log --pretty=oneline  #结果在一行显示
10e7ef93646c14e8e9c218895690a8fea9eaa3b5 add git test
671b3e7e242c1706a7e6662f8ee5edbf51e25b40 add distributed
1493e1dfec607f82842f3f17fb82593c80d24c6a commit b.txt
e1dea08907276d2e89e6ff856bf769388d9c5883 add a git.txt by zhangluya

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

[root@console git_learn]# cat git.txt 
git test
git is a free software!
git is a distributed version console system!
[root@console git_learn]# git reset --hard HEAD^ #回退到上个版本
HEAD is now at 671b3e7 add distributed
[root@console git_learn]# cat git.txt 
git is a free software!
git is a distributed version console system!


假设回退错误,还想回退到最近更新的版本:
[root@console git_learn]# git reset --hard 10e7ef
HEAD is now at 10e7ef9 add git test
[root@console git_learn]# cat git.txt 
git test
git is a free software!
git is a distributed version console system!
[root@console git_learn]# git log --pretty=oneline
10e7ef93646c14e8e9c218895690a8fea9eaa3b5 add git test
671b3e7e242c1706a7e6662f8ee5edbf51e25b40 add distributed
1493e1dfec607f82842f3f17fb82593c80d24c6a commit b.txt
e1dea08907276d2e89e6ff856bf769388d9c5883 add a git.txt by zhangluya

[root@console git_learn]# git reflog  #每次提交记录
10e7ef9 HEAD@{0}: 10e7ef: updating HEAD
671b3e7 HEAD@{1}: HEAD^: updating HEAD
10e7ef9 HEAD@{2}: commit: add git test
671b3e7 HEAD@{3}: commit: add distributed
1493e1d HEAD@{4}: commit: commit b.txt
e1dea08 HEAD@{5}: commit (initial): add a git.txt


git checkout --  file可以丢弃工作区的修改: --和file之间要有空格
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。

git文件删除:
git rm filename
git commit -m "delete file"

误删除要撤销没提交之前可以这么做:
使用:git checkout -- filename

关联远程git库:
git remote add origin git@github.com:zhangluya1987/git_learn.git
请千万注意,把上面的zhangluya替换成你自己的GitHub账户名,否则,
你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推
不上去的,因为你的SSH Key公钥不在我的账户列表中.
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,
但是origin这个名字一看就知道是远程库。下一步,就可以把本地库的所有
内容推送到远程库上:

git remote add origin git@github.com:zhangluya1987/git_learn.git
git push -u origin master #第一次加 -u
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,
Git不但会把本地的master分支内容推送的远程新的master分支,还
会把本地的master分支和远程的master分支关联起来,在以后的推
送或者拉取时就可以简化命令。
--------------------------------------------------------------------------
touch README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/zhangluya1987/git_learn.git
git push -u origin master
Push an existing repository from the command line

git remote add origin https://github.com/zhangluya1987/git_learn.git
git push -u origin master

克隆远程代码库:
git clone git@github.com:zhangluya1987/git_learn.git

创建分支与合并分支:
首先,我们创建dev分支,然后切换到dev分支:
git checkout -b dev_git

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
git branch dev
git checkout dev


用git branch命令查看当前分支:
git branch
* dev
  master
git branch命令会列出所有分支,当前分支前面会标一个*号。

然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

Creating a new branch is quick.
然后提交:
git add readme.txt 
git commit -m "branch test"
[dev fec145a] branch test

现在,dev分支的工作完成,我们就可以切换回master分支:
git checkout master

合并分支:将dev_git分支合并到master分支
 git merge dev_git

删除开发分支:
git branch -d dev_git
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分支:git checkout -b name
合并某分支到当前分支:git merge name
删除分支:git branch -d name

解决冲突:
删除分支冲突部分
git log --graph  #查看所有分支

准备合并dev分支,请注意--no-ff参数,表示禁用“Fast forward”:
$ git merge --no-ff -m "merge with no-ff" dev
原文地址:https://www.cnblogs.com/chunguang/p/5541875.html