[关闭]
@Purpose 2017-03-17T13:45:50.000000Z 字数 5930 阅读 1184

Git使用笔记

学习笔记



搭建Git

首先安装Git ,一句命令 sudo apt-get install git
然后设置你的密码和email,不然谁知道是你提交的更改

  1. $ git config --global user.name "Your Name"
  2. $ git config --global user.email "email@example.com"

这里用了global参数,表示这台机器上所有的git仓库都会使用这个配置,当然,你也可以对某个仓库制定不同的用户名和Email地址


创建版本库

找到一个你觉得顺眼的地方,然后大方敲出一行git init

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

然后就又一个版本库了,当然,你直接ls是看不到的,因为它偷偷藏起来了,你需要ls -ah才能看到(这个时候在当前目录下就会多一个.git文件,没事被手贱乱改啊,不然崩了你就GG了)
然后你在当前目录以及子目录下的文件都可以提交到Git仓库里面,相比把大象放到冰箱需要三步,把东西扔进git只需要两步
首先,用git add把东西扔进去

  1. $ git add readme.txt

然后用git commit -m把文件提交到仓库中

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

注意,-m这个参数后面输入的是你对本次提交的说明,当然,你可以啥都不干,然而这样做不好,输入说明对自己和别人阅读都很重要

为啥提交需要两步呢?这是因为commit可以一次性提交多个文件,你可以多次add不同的文件

  1. $ git add file1.txt
  2. $ git add file2.txt file3.txt
  3. $ git commit -m "add 3 files."

时光机穿梭

git status命令可以查看仓库的当前状态,它会告诉你哪些东西做了改动

  1. $ git status
  2. # On branch master
  3. # Changes not staged for commit:
  4. # (use "git add <file>..." to update what will be committed)
  5. # (use "git checkout -- <file>..." to discard changes in working directory)
  6. #
  7. # modified: readme.txt
  8. #
  9. no changes added to commit (use "git add" and/or "git commit -a")

然而,但是如果你想知道具体在文件的哪里改了,这个时候你就要用git diff来查看具体的修改内容了。

  1. $ git diff readme.txt
  2. diff --git a/readme.txt b/readme.txt
  3. index 46d49bf..9247db6 100644
  4. --- a/readme.txt
  5. +++ b/readme.txt
  6. @@ -1,2 +1,2 @@
  7. -Git is a version control system.
  8. +Git is a distributed version control system.
  9. Git is free software.

成功commit之后再用git status来查看仓库状态的时候,就会显示当前没有要提交的修改,而且工作目录是干净的(working directory clean)

  1. $ git status
  2. # On branch master
  3. nothing to commit (working directory clean)

版本退回

git log 可以查看提交日志

  1. $ git log
  2. commit 3628164fb26d48395383f8f31179f24e0882e1e0
  3. Author: Michael Liao <askxuefeng@gmail.com>
  4. Date: Tue Aug 20 15:11:49 2013 +0800
  5. append GPL
  6. commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
  7. Author: Michael Liao <askxuefeng@gmail.com>
  8. Date: Tue Aug 20 14:53:12 2013 +0800
  9. add distributed
  10. commit cb926e7ea50ad11b8f9e909c05226233bf755030
  11. Author: Michael Liao <askxuefeng@gmail.com>
  12. Date: Mon Aug 19 17:51:55 2013 +0800
  13. wrote a readme file

如果你嫌参数过多,可以用git log --pretty=oneline

  1. $ git log --pretty=oneline
  2. 3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
  3. ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
  4. cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

这个时候你可以看到有一大堆数字,那是每个版本号的commit id,由SHA1计算出来的一个很大的数字(十六进制)
如果需要倒退上一个版本的话,用git reset --hard HEAD^
(一个^表示倒退一个版本,如果倒退的版本过多,可以用HEAF~100这样的命令来表示)

  1. $ git reset --hard HEAD^
  2. HEAD is now at ea34578 add distributed

也可以通过指定id号来回到某个版本(版本号很长的说,你输入前五六位这样基本就可以找到的了)

  1. $ git reset --hard 3628164
  2. HEAD is now at 3628164 append GPL

如果忘记了版本号,可以通过 git reflog来找到你每一次的命令,在这里你可以找到对应的commit_id

  1. $ git reflog
  2. ea34578 HEAD@{0}: reset: moving to HEAD^
  3. 3628164 HEAD@{1}: commit: append GPL
  4. ea34578 HEAD@{2}: commit: add distributed
  5. cb926e7 HEAD@{3}: commit (initial): wrote a readme file

工作区和暂存区

工作区:就是在电脑中能看到的目录
版本库:工作区中有一个隐藏目录.git,这个不算是工作区,而是git的版本库
在版本库中,有一个叫做stage(或者叫index)的暂存区,还有一个git为我们自动生成的第一个分支master,以及一个指向master的指针HEAD
当我们用git add提交修改的时候,就是把东西提交到缓存区
当我们用git commit提交更改时,就是把暂存区中的东西提交到当前分支中去


管理修改

Git管理的是修改,而不是文件
当你用git add后,Git把修改提交到暂存区,准备提交,然后你再次修改文件之后直接git commit,这个时候你会发现第二次修改并没有提交到分支中去,这是因为commit只会把暂存区中的修改提交,新的修改没有用git add提交到暂存区
如果你不信可以用 git diff HEAD --filename来查看工作区的文件和版本库的文件有什么不一样
所以记住,不add到暂存区,就不会加入commit中


撤销修改

如果你写错了代码,可以用git status查看,这个时候git会提醒你,用git checkout -- file 可以丢弃工作区的修改

  1. $ git status
  2. # On branch master
  3. # Changes not staged for commit:
  4. # (use "git add <file>..." to update what will be committed)
  5. # (use "git checkout -- <file>..." to discard changes in working directory)
  6. #
  7. # modified: readme.txt
  8. #
  9. no changes added to commit (use "git add" and/or "git commit -a")

命令git checkout -- file 的意思是,把file文件在工作区的修改全部撤销,这里有两种情况
第一,你还没有把它放进暂存区,这个时候撤销就回到和版本库一模一样的状态
第二,它之前已经提交到暂存区了,现在又做了修改,现在撤销就回到了添加暂存区后的状态

如果你的错误代码已经提交到了暂存区中的话,用git status查看的话,它也为会提醒你可以用git reset HEAD file 把修改撤销掉,重新放回工作区(用HEAD表示最新版本)

  1. $ git status
  2. # On branch master
  3. # Changes to be committed:
  4. # (use "git reset HEAD <file>..." to unstage)
  5. #
  6. # modified: readme.txt
  7. #
  8. $ git reset HEAD readme.txt
  9. Unstaged changes after reset:
  10. M readme.txt

放回工作区之后再通过git checkout 来丢弃工作区的修改

  1. $ git checkout -- readme.txt
  2. $ git status
  3. # On branch master
  4. nothing to commit (working directory clean)

如果你已经commit到分支中了的话,没事,用上面学的版本退回就好,然而……如果你把修改提交到远程仓库之后,那么不好意思,你已经GG了


删除文件

在Git中想要删除一个文件的话,直接在工作区用rm把它删了,这个时候你用git status查看的话,它就会告诉你啥文件被删了,

  1. $ git status
  2. # On branch master
  3. # Changes not staged for commit:
  4. # (use "git add/rm <file>..." to update what will be committed)
  5. # (use "git checkout -- <file>..." to discard changes in working directory)
  6. #
  7. # deleted: test.txt
  8. #
  9. no changes added to commit (use "git add" and/or "git commit -a")

这个时候你有两种选择,第一是确实要从版本库中删除这个文件,这个时候就用git rm 来删除掉,并且commit

  1. $ git rm test.txt
  2. rm 'test.txt'
  3. $ git commit -m "remove test.txt"
  4. [master d17efd8] remove test.txt
  5. 1 file changed, 1 deletion(-)
  6. delete mode 100644 test.txt

第二种情况是你自己突然脑抽误删的,这个时候你可以用git checkout -- file 来把误删的文件恢复到最新版本

  1. $ git checkout -- test.txt

远程仓库


创建私钥和公钥

在用户的主目录下,查看有没有.ssh这个目录,该目录下有木有id_rsa和id_rsa.pub这两个文件,如果有就跳过这里,没有的话要手动配置

  1. $ ssh-keygen -t rsa -C "youremail@example.com"

把邮箱替换成你自己的邮箱,然后一路回车用默认值就可以了,这样就能创建好私钥和公钥了,公钥你随便给别人也无所谓,但是私钥千万不能透露


Coding关联公钥

登录Coding,进入你的个人页面选中左侧菜单栏的帐户,然后选择SSH公钥,在页面下把你的id_rsa.pub的内容复制到里面,然后保存就可以了,这个时候你的账号就关联这个公钥了,通过git就可以连接到项目的远程仓库了


添加远程仓库

这个时候你可以连接到远程仓库了,然而要怎么连接呢
首先你要进入我们项目的仓库复制SSH连接的地址

  1. $ git remote add origin git@git.coding.net:PurposeDragon/SupportGroupOfYP.git

(这个例子中的仓库真的是我们项目的仓库,当然,谁都能关联,然而没有公钥不能推送)
添加之后,远程仓库的名字就是我们命令行中给他设定的名字 origin (国际惯例,让人一看就知道这是远程仓库的意思)

然后我们可以用git push命令,把分支推送到远程仓库

  1. $ git push -u origin master
  2. Counting objects: 19, done.
  3. Delta compression using up to 4 threads.
  4. Compressing objects: 100% (19/19), done.
  5. Writing objects: 100% (19/19), 13.73 KiB, done.
  6. Total 23 (delta 6), reused 0 (delta 0)
  7. To git@github.com:michaelliao/learngit.git
  8. * [new branch] master -> master
  9. Branch master set up to track remote branch master from origin.

如果仓库是空的话,我们要加上-u参数,当然,我们现在上面有东西了,不用这个参数
值得注意的是,如果我们是第一次连接的话,是会有一个ssh的警告的,你直接一个yes就可以了,以后这个警告就不会出现的了

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

克隆代码库

我们可以用clone直接把远程仓库中的东西下载到本地

  1. $ git clone git@github.com:michaelliao/gitskills.git
  2. Cloning into 'gitskills'...
  3. remote: Counting objects: 3, done.
  4. remote: Total 3 (delta 0), reused 0 (delta 0)
  5. Receiving objects: 100% (3/3), done.
  6. $ cd gitskills
  7. $ ls
  8. README.md

这样我们就可以把仓库中的东西轻松地下到本地了

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注