作为程序员一定要保持良好的睡眠,才能好编程

Git使用总结

发布时间:2020-01-30

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013752340242354807e192f02a44359908df8a5643103a000


什么是git

git是目前世界上最先进的分布式管理系统


git有什么特点:高端大气上档次


版本控制系统?


如果你用Microsoft Word写过长篇大论,那你一定有这样的经历:

想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:

1.png


过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。

看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。

更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件Copy到U盘里给她(也可能通过Email发送一份给她),然后,你继续修改Word文件。一天后,同事再把Word文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。

于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?

这个软件用起来就应该像这个样子,能记录每次文件的改动:

版本用户说明日期
1张三删除了软件服务条款57/12 10:38
2张三增加了License人数限制7/12 18:09
3李四财务部门调整了合同金额7/13 9:51
4张三延长了免费升级周期7/14 15:17

这样,你就结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪。


GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby


那么如何安装和下载这个软件呢?

如果是windows可以直接使用exe软件进行安装,如果是linux或unix可以使用命令去安装


mkdir floderName





程序运行代码:


//创建仓库名称

Administrator@PC201506251203 MINGW64 /

$ mkdir learngit


//进入目录 

Administrator@PC201506251203 MINGW64 /

$ cd learngit


//查看目录 

Administrator@PC201506251203 MINGW64 /learngit

$ ll

total 1

-rw-r--r-- 1 Administrator 197121 55 二月 13 16:00 readme.txt


//当前所在的路径

Administrator@PC201506251203 MINGW64 /learngit

$ pwd

/learngit


//初始化

Administrator@PC201506251203 MINGW64 /learngit

$ git init

Initialized empty Git repository in C:/Program Files/Git/learngit/.git/


//添加一个文件

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git add readme.txt


//然后提交一下

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git commit -m "wrote a readme file"


*** Please tell me who you are.


Run


  git config --global user.email "you@example.com"

  git config --global user.name "Your Name"


to set your account's default identity.

Omit --global to set the identity only in this repository.


fatal: empty ident name (for <(null)>) not allowed


如果有上面的提示,证明没有进行提交验证


进行登录验证:

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git config --global user.email "574482856@qq.com"


Administrator@PC201506251203 MINGW64 /learngit (master)

$ git config --global user.name "james"



//添加文件

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git add readme.txt


//提交  git commit -m "这是注释"

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git commit -m "write a readme file"

[master (root-commit) 7cba7a6] write a readme file

 1 file changed, 2 insertions(+)

 create mode 100644 readme.txt


//查看 

Administrator@PC201506251203 MINGW64 /learngit (master)

$ ls

readme.txt




//可以同时提交多个 git add file1.txt file2.txt

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git add file1.txt file2.txt

//提交 

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git commit -m "write two file names:file1 file2"

[master f457d4c] write two file names:file1 file2

 2 files changed, 2 insertions(+)

 create mode 100644 file1.txt

 create mode 100644 file2.txt


//如何查看现在的状态怎么样,是否有更新是否最新版本? git status

//情景1:readme.txt 我们进行了修改,那么服务器和本地是否一致呢?通过 git status 进行检验

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git status

On branch master

Changes not staged for commit:  //改变了但是没有提交,请执行  git add file  和 git commit -a 更新

  (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 commit -a 这个命令的使用方法:

3.png




//知道这个代码修改了哪些? git diff

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git diff

diff --git a/readme.txt b/readme.txt

index d8036c1..013b5bc 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.

\ No newline at end of file



Administrator@PC201506251203 MINGW64 /learngit (master)

$ git add readme.txt


//添加了,但是没有commit提交的过程:

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git status

On branch master

Changes to be committed:

  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.txt


//git commit -m "介绍" 

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git commit -m "readme.txt add distributed"

[master dc65745] readme.txt add distributed

 1 file changed, 1 insertion(+), 1 deletion(-)



//上面的改动已经提交,现在保持最新状态,且是干净的

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git status

On branch master

nothing to commit, working directory clean


Administrator@PC201506251203 MINGW64 /learngit (master)

$


//如果没有执行 git add 这样命令,则无法执行commit这样的命令

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git commit -m "write two file1 file2"

On branch master

Untracked files:

        file1.txt

        file2.txt


nothing added to commit but untracked files present


2.png

也可以使用 git diff 这样查看所有


小结1

初始化一个Git仓库,使用git init命令。

添加文件到Git仓库,分两步:

首先登陆git,那么如何登陆? 

git config --global user.email ""

git config --global user.name ""

进行登录,然后执行下面的命令

  • 第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;

  • 第二步,使用命令git commit,完成。


小结2

  • 要随时掌握工作区的状态,使用git status命令。

  • 如果git status告诉你有文件被修改过,用git diff可以查看修改内容。



像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

现在,我们回顾一下readme.txt文件一共有几个版本被提交到Git仓库里了:

4.png


当然了,在实际工作中,可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

git log 显示出所有的提交记录

5.png



git log --pretty=oneline 把历史记录现在一行

6.png

需要友情提示的是,你看到的一大串类似3628164...882e1e0的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。



恩,那么我们如何恢复到上一个版本呢? 比如 readme.txt 我恢复到 zheshi  应该如何操作呢?

git reset --hard head^

解释说明: ^ 上一个版本  ^^上两个版本  ^^^上三个版本 依次类推   那么上100个版本如何写? git reset --hard head~100

7.png


现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?

在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:

git reflog 可以看到所有执行过的代码历史记录:可以查看,如图:

8.png




$ git reset --hard 版本号 也可以通过这种方式进行时光穿梭,如图:

9.png

小结3

$ git add readme.txt$ git commit -m "append GPL"[master 3628164] append GPL
 1 file changed, 1 insertion(+), 1 deletion(-)

现在总结一下:

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。


 git 管理的修改,而不是文件,比如我们修改了readme.txt 文件中的内容 it's cat ,执行了 git add readme.txt 然后 我再次修改成 it's beautiful cat 那么执行 git commit -m "readme.txt chanages"

你看到的变化只会是:it's cat,如图:



提交后,用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别

10.png

那怎么提交第二次修改呢?你可以继续git addgit commit,也可以别着急提交第一次修改,先git add第二次修改,再git commit,就相当于把两次修改合并后一块提交了:

第一次修改 -> git add -> 第二次修改 -> git add -> git commit

好,现在,把第二次修改提交了,然后开始小结。

小结

现在,你又理解了Git是如何跟踪修改的,每次修改,如果不add到暂存区,那就不会加入到commit中。






对某一个文件进行了错误的修改:如何撤销对这个文件的修改:

git checkout -- readme.txt 撤销对readme.txt 的修改



既然错误发现得很及时,就可以很容易地纠正它。

你可以删掉最后一行,手动把文件恢复到上一个版本的状态。

如果用git status查看一下:

$ 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会告诉你,git checkout -- file可以丢弃工作区的修改:

$ git checkout -- readme.txt

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

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

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

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

现在,看看readme.txt的文件内容:

$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.

文件内容果然复原了。




这个命令可以回复没有commit之前的版本:

比如修改了readme.txt 这个文件后,执行了 git add file 放到了暂存区,此时通过 git checkout -- fileName 就不能回复内容了。

$ git reset --hard head

HEAD is now at 7f7dc77 readme.txt beautiful cat



情景1: git checkout -- readme.txt 撤销修改文件

情景2: git reset HEAD readme.txt  撤销暂存区的修改文件 git checkout -- readme.txt

情景3: 提交了,commit ,只能用版本回退了


如何删除一个文件:

git rm file2.txt 只是一个删除指令,并没有真正的删除掉

git commit -m 'remove file2.txt"

这才是真正的提交到版本库的删除。

如果删错了,如何恢复?  git checkout -- file2.txt 就可以恢复回来。

12.png


你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

创建id_rsa.pub 与id_rsa,并显示出文件所在的位置:

Administrator@PC201506251203 MINGW64 /web001

$ ssh-keygen -t rsa -C "574482856@qq.com"

然后一路回车,使用默认值即可

Generating public/private rsa key pair.

Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):

Created directory '/c/Users/Administrator/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.

Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.

The key fingerprint is:

SHA256:vrFMV4XPuIP4YlFozoHk8FypZtE9R1oK/e3xbF4ysss 574482856@qq.com

The key's randomart image is:

+---[RSA 2048]----+

|       ..+ .o    |

|    . o +.++..   |

|     * = .o+...  |

|      O + . .=o  |

|     o +So  o.o+ |

|       .+. o..+ =|

|        =.o oo =.|

|       oo* ...  .|

|       .+.. E.   |

+----[SHA256]-----+



git remote add origin git@github.com/songyongzhan/ww.git


 


Administrator@PC201506251203 MINGW64 /web001

$ git remote add origin git@github.com:songyongzhan/web001.git

fatal: Not a git repository (or any of the parent directories): .git


Administrator@PC201506251203 MINGW64 /web001

$ git remote add origin git@github.com:songyongzhan/web001.git

fatal: Not a git repository (or any of the parent directories): .git


Administrator@PC201506251203 MINGW64 /web001

$ git remote add origin https://github.com/songyongzhan/web001.git

fatal: Not a git repository (or any of the parent directories): .git


Administrator@PC201506251203 MINGW64 /web001

$ git remote add origin git@github.com:songyongzhan/web001.git

fatal: Not a git repository (or any of the parent directories): .git


Administrator@PC201506251203 MINGW64 /web001

$ cd ../


Administrator@PC201506251203 MINGW64 /

$ ls

bin/  git-bash.exe*  mingw64/           unins000.dat   web001/

cmd/  git-cmd.exe*   proc/              unins000.exe*

dev/  learngit/      ReleaseNotes.html  unins000.msg

etc/  LICENSE.txt    tmp/               usr/


Administrator@PC201506251203 MINGW64 /

$ cd learngit



//本地库如何与远程结合起来:

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git remote add origin git@github.com:songyongzhan/web001.git


//ps 解释说明:songyongzhan/web001.git 这是在github上创建的一个仓库


Administrator@PC201506251203 MINGW64 /learngit (master)

$ ls

file1.txt  readme.txt


//将本地文件上传到网站上:

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git push -u origin master

The authenticity of host 'github.com (192.30.253.113)' can't be established.

RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.

Counting objects: 25, done.

Delta compression using up to 4 threads.

Compressing objects: 100% (20/20), done.

Writing objects: 100% (25/25), 2.04 KiB | 0 bytes/s, done.

Total 25 (delta 5), reused 0 (delta 0)

remote: Resolving deltas: 100% (5/5), done.

To git@github.com:songyongzhan/web001.git

 * [new branch]      master -> master

Branch master set up to track remote branch master from origin.




git https方式pull、push时, 
老是提示: 
(gnome-ssh-askpass:12666): Gtk-WARNING **: cannot open display: 
error: unable to read askpass response from ‘/usr/libexec/openssh/gnome-ssh

解决办法: 
关闭SSH_ASKPASS

# unset SSH_ASKPASS


//新建b.php并输入内容保存:

Administrator@PC201506251203 MINGW64 /learngit (master)

$ vim b.php


//添加到git

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git add b.php

warning: LF will be replaced by CRLF in b.php.

The file will have its original line endings in your working directory.


Administrator@PC201506251203 MINGW64 /learngit (master)

$ ls

b.php  file1.txt  readme.txt


Administrator@PC201506251203 MINGW64 /learngit (master)

$ git commit -m "add file b.php"

[master 18cecd1] add file b.php

warning: LF will be replaced by CRLF in b.php.

The file will have its original line endings in your working directory.

 1 file changed, 9 insertions(+)

 create mode 100644 b.php


//$ git push -u origin master 上传

Administrator@PC201506251203 MINGW64 /learngit (master)

$ git push -u origin master

Counting objects: 3, done.

Delta compression using up to 4 threads.

Compressing objects: 100% (3/3), done.

Writing objects: 100% (3/3), 393 bytes | 0 bytes/s, done.

Total 3 (delta 0), reused 0 (delta 0)

To git@github.com:songyongzhan/web001.git

   faa39a4..18cecd1  master -> master

Branch master set up to track remote branch master from origin.


  

从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master

把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

SSH警告

当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?

这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。

Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:

Warning: Permanently added 'github.com' (RSA) to the list of known hosts.

这个警告只会出现一次,后面的操作就不会有任何警告了。

如果你实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。



提交所有的资料:

git add . 
git commit -m “上传网站源码到github” 

然后放在github中

clone 这是克隆 远程地址上的数据。



You have not concluded your merge (MERGE_HEAD exists) git拉取失败

错误可能是因为在你以前pull下来的代码没有自动合并导致的.

有2个解决办法:

1.保留你本地的修改

git merge --abort

git reset --merge

合并后记得一定要提交这个本地的合并

然后在获取线上仓库

git pull


2.down下线上代码版本,抛弃本地的修改

不建议这样做,但是如果你本地修改不大,或者自己有一份备份留存,可以直接用线上最新版本覆盖到本地

git fetch --all

git reset --hard origin/master

git fetch


 

git相关命令:


git checkout

git status

git checkout -b

git commit

git diff

git add

git clean -fdx

git fetch --prune

git pull --ff-only

git branch -D

git push

git merge

git rm

git rebase

git reset

git revert

git push origin :yourbranch