https://blog.csdn.net/tsq292978891/article/details/78965693  git  回流

 

yum -y install git ----安装git

GIT的基本使用命令

$ git config --global user.name "Your Name"   这个是用来输入你git库的名字
$ git config --global user.email "[email protected]"  这个是你git库的Email地址,和git库的名字一样,是一个别人认识你的标识。


注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

$ git init
 Initialized empty Git repository in /Users/michael/learngit/.git/


git init这个指令是在你当前的文件夹下创建一个git仓库,瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

如果没有找到.git的目录,那说明这个目录默认是隐藏的,用ls -al就可以看到了

$ git add readme.txt


git add 这个命令是用来添加文件当git仓库的 ,当你添加完之后一定要用git commit这个命令提交,执行上面的命令,没有任何显示,这就对了,Unix的哲学是没有消息就是好消息,说明添加成功。

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


git commit 这个命令是用来提交文件到git仓库的,当你git add 文件之后还要再用git commit 这个命令来提交一下,当你执行很多git add之后,可以用git commit来一起提交,后面的-m参数是用来描述添加的文件内容的,也可以视作是一个标记,方便后面的恢复

$ 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:   readme.txt
 
no changes added to commit (use "git add" and/or "git commit -a")


git status这个命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,文件已经被修改过了,但是还没有用commit来提交修改的内容

$ git diff readme.txt
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.


 

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:

减号那一行是修改之前的,加号那一行是修改之后的

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao 
Date:   Fri May 18 21:06:15 2018 +0800
 
    append GPL
 
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao 
Date:   Fri May 18 21:03:36 2018 +0800
 
    add distributed
 
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao 
Date:   Fri May 18 20:59:18 2018 +0800
 
    wrote a readme file
=======================分隔符(个人添加,以便区分)========================
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file


git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file

加上--pretty=oneline参数:可以简化log的输出信息,需要友情提示的是,你看到的一大串类似1094adb...的是commit id(版本号),和SVN不一样,Gitcommit id不是123……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用123……作为版本号,那肯定就冲突了。

$ git reset --hard HEAD^
HEAD is now at e475afc add distributed


git reset是回滚版本的命令,之前添加提交了那么多的修改版本,可以用git log来输出出来,然后可以根据输出内容,用git reset来回滚显示的内容,但是,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100^比较容易数不过来,所以写成HEAD~100

$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL


当然,你也可以用commit id来回到你最新的文件,就是在你回滚之前的版本,但是要知道要回滚版本的commit id 这个可以git log --pretty=oneline来实现,其中的1094adb7b9b3807259d...这一串就是commit id,只需要写前几位就可以了

$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file


如果是电脑关机后,又后悔回滚了,然后找不到commit id 了,就可以用 git reflog 来查看曾经的历史命令,就可以看到里面的commit id

spacer.gif

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区。其实就是在我们使用git add 添加文件之后,但是又没有用commit去提交,那个存放add文件的地方就是暂存区

git checkout -- readme.txt


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

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

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

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

 git reset HEAD readme.txt
Unstaged changes after reset:
M    readme.txt


git reset HEAD 文件名 这个命令可以撤销你在暂存区add的文件,把修改的文件退回到工作区,然后从工作区使用git checkout --文件名字 撤销在工作去修改的文件

$ git rm test.txt
rm 'test.txt'
 
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt


git rm 文件 这个命令是用来删除文件的,当你在本地对添加了版本库的文件用了rm后,那你也要从用git rm 那个文件名 然后用commit来提交后,才会在版本库中删除,当然,如果是你误删了文件,那你也可以在工作区中使用git checkout --文件名字来恢复,暂存区就用git reset HEAD 文件名 这个命令来恢复

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

你可以使用git reset --hard HEAD^来恢复

 

远程仓库

在关联远程仓库时,必须先把本地机器的公钥,放到远程库,而创建密钥对的命令则是如下图所示:

ssh-keygen -t rsa -C "[email protected]"


这样会在家目录里呈现一个.ssh的隐藏文件夹,里面放着公钥和私钥,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。然后将公钥的内容放到远程库上面

git remote add origin [email protected]:michaelliao/learngit.git


git remote add origin这个是关联远程库的命令,.com后面的内容需要跟上自己的账号,然后是文件夹的名字,远程库的名字就叫做origin,这个是git的默认叫法,也可以改成别的名字

git push -u origin master


git push是将本地master推送到远程库origin上面去,第一次用push或者clone连接的时候,会有一个警告,这个可以忽略掉

git clone [email protected]:michaelliao/gitskills.git


git clone这个命令是将远程仓库的代码克隆到本地,而这句话的意思就是将远程库的gitskills文件夹以及里面的内容克隆到本地

GIT分支

 

GIT还可以创建分支,分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。但Git的分支是与众不同的,无论创建、切换和删除分支,Git1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

分支的含义

版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

git checkout -b dev


git checkout -b 后面跟要创建的分支 这个命令是用来创建分支的,但是加上-b这个参数后就是创建并把hard指向dev这个分支了

$ git branch
* dev
  master


git branch 这个命令是查看所有的分支,并且当前使用的分支会使用*号标注

git checkout master


这个命令还可以切换已有的分支,比如说我有现在有两个分支,一个是master,一个是dev,我checkout dev就是切换到dev的分支了,再用git commit 提交,就是提交到dev,而不是提交到master

git merge dev
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)
 


刚才我们用git checkout已经切换到master分支了,然后git merge dev 这个命令就是把dev的分支合并到当前所在的分支

$ git branch -d dev
Deleted branch dev (was b17d20e).


当我们合并玩分支后,就可以把dev这个分支删除了,git branch -d dev 这个就是删除dev的分支的命令

分支冲突

当你master分支有一个ceshi.txt的文件时,你又建了另外一个分支,另外的这个分支里有一个同样的ceshi.txt文件,两边都有修改和提交,然后你再切换到master的分支,将另外的分支合到master主分支时就会报错,这个时候就需要自己手动去更改自己想要的内容了,合并分支时,对两个分支下的相同内容,不能同时修改和提交,不然会有冲突报错,只能时新建分支的那个内容修改和提交,这样才不会有冲突