http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013752340242354807e192f02a44359908df8a5643103a000
什么是git?
git是目前世界上最先进的分布式管理系统
git有什么特点:高端大气上档次
版本控制系统?
如果你用Microsoft Word写过长篇大论,那你一定有这样的经历:
想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:
过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。
看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。
更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件Copy到U盘里给她(也可能通过Email发送一份给她),然后,你继续修改Word文件。一天后,同事再把Word文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。
于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?
这个软件用起来就应该像这个样子,能记录每次文件的改动:
版本 | 用户 | 说明 | 日期 |
---|---|---|---|
1 | 张三 | 删除了软件服务条款5 | 7/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 这个命令的使用方法:
//知道这个代码修改了哪些? 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
也可以使用 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仓库里了:
当然了,在实际工作中,可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log
命令查看:
git log 显示出所有的提交记录
git log --pretty=oneline 把历史记录现在一行
需要友情提示的是,你看到的一大串类似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
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id
怎么办?
在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^
回退到add distributed
版本时,再想恢复到append GPL
,就必须找到append GPL
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
git reflog 可以看到所有执行过的代码历史记录:可以查看,如图:
$ git reset --hard 版本号 也可以通过这种方式进行时光穿梭,如图:
小结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
命令可以查看工作区和版本库里面最新版本的区别
那怎么提交第二次修改呢?你可以继续git add
再git 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 commit
或git 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 就可以恢复回来。
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_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
//新建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