git手册

/ 随笔 / 0 条评论 / 286浏览

Git常用操作

文档时间:2016年05月14日23:58:29
  1. 提交新文件

第一步添加文件:git add readme.txt //文件必须在git的仓库目下 第二步提交变动:git commit readme.txt //或者 git commit readme.txt -m "添加readme.txt文件,这里必须写入说明"

  1. 提交修改

位于分支 master 尚未暂存以备提交的变更: (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: readme.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

$ git diff diff --git a/readme.txt b/readme.txt index 9bb4dfe..981a41b 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1,2 @@ My first git file +这里是第一次修改

$ git status 位于分支 master 尚未暂存以备提交的变更: (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: readme.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

$ git status 位于分支 master 无文件要提交,干净的工作区

  1. git 回到历史版本

$ git log commit 1c71f838147fe1ccba9d271b6e887d69e1953150 Author: adaivskenan adaivskenan@foxmail.com Date: Sun May 15 09:33:08 2016 +0800 第二次修改 commit cdd599457423fa678fbbafad3fafc78dc827b0da Author: adaivskenan adaivskenan@foxmail.com Date: Sun May 15 00:46:59 2016 +0800 添加改动 commit bbd0121be8fab4cfbe49554bc65ffa732ffa9796 Author: adaivskenan adaivskenan@foxmail.com Date: Sun May 15 00:06:23 2016 +0800 提交了我的第一个readme,这里是本次提交的说明

**查看可以加参数**  

$ git log --pretty=oneline 1c71f838147fe1ccba9d271b6e887d69e1953150 第二次修改 cdd599457423fa678fbbafad3fafc78dc827b0da 添加改动 bbd0121be8fab4cfbe49554bc65ffa732ffa9796 提交了我的第一个readme,这里是本次提交的说明

$ git reset --hard HEAD^ HEAD 现在位于 cdd5994 添加改动 $ git log --pretty=oneline cdd599457423fa678fbbafad3fafc78dc827b0da 添加改动 bbd0121be8fab4cfbe49554bc65ffa732ffa9796 提交了我的第一个readme,这里是本次提交的说明

  1. git 重返未来

$ git reflog cdd5994 HEAD@{0}: reset: moving to HEAD^ 1c71f83 HEAD@{1}: reset: moving to 1c71f83 cdd5994 HEAD@{2}: reset: moving to HEAD^ 1c71f83 HEAD@{3}: commit: 第二次修改 cdd5994 HEAD@{4}: commit: 添加改动 bbd0121 HEAD@{5}: commit (initial): 提交了我的第一个readme,这里是本次提交的说明

$ git reset --hard 1c71f83 HEAD 现在位于 1c71f83 第二次修改 $ git log --pretty=oneline 1c71f838147fe1ccba9d271b6e887d69e1953150 第二次修改 cdd599457423fa678fbbafad3fafc78dc827b0da 添加改动 bbd0121be8fab4cfbe49554bc65ffa732ffa9796 提交了我的第一个readme,这里是本次提交的说明

  1. 撤销文件
  2. 撤销工作区文件
$ cat readme.txt

> My first git file

这里是第一\这是第二次修改加入中间\次修改 add操作 add后添加 $ vi readme.txt

$ cat readme.txt
> My first git file

这里是第一\这是第二次修改加入中间\次修改 add操作 add后添加 林俊杰JJ

**$ git checkout -- readme.txt**

$ cat readme.txt
> My first git file

这里是第一\这是第二次修改加入中间\次修改 add操作 add后添加

  1. 撤销缓存区文件
$ cat readme.txt
> My first git file

这里是第一\这是第二次修改加入中间\次修改 add操作 add后添加 JJ 林俊杰

$ git status可以看到此时文件在暂存区

> 位于分支 master

要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 修改: readme.txt

$ git reset HEAD readme.txt //重置暂存区

> 重置后取消暂存的变更:

M readme.txt

$ cat readme.txt //工作区此时并未改变

> My first git file

这里是第一\这是第二次修改加入中间\次修改 add操作 add后添加 JJ 林俊杰

$ git status

> 位于分支 master

尚未暂存以备提交的变更: (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: readme.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

$ git checkout -- readme.txt //丢弃工作区的改动

$ git status //此时文件以恢复HEAD的版本

> 位于分支 master

无文件要提交,干净的工作区

$ cat readme.txt

> My first git file

这里是第一\这是第二次修改加入中间\次修改 add操作 add后添

  1. 撤销版本库文件(没有进行push到远程库的操作)
参考**git 回到历史版本**,先将HEAD指向历史版本
  1. 删除文件
  2. 文件add到暂存后删除工作区文件
$ la

> .git  readme.txt  test.txt

$ git add test.txt

$ git status

> 位于分支 master

要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 新文件: test.txt

$ rm test.txt

$ git status

> 位于分支 master

要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 新文件: test.txt 尚未暂存以备提交的变更: (使用 "git add/rm <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 删除: test.txt

$ git rm test.txt

> rm 'test.txt'

$ git status

位于分支 master 无文件要提交,干净的工作区

  1. 文件commit到版本库后删除工作区文件
$ la

.git readme.txt test.txt

$ rm test.txt

$ git status

> 位于分支 master

尚未暂存以备提交的变更: (使用 "git add/rm <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 删除: test.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

$ git rm test.txt

> rm 'test.txt'

$ la

> .git  readme.txt

$ git status

> 位于分支 master

要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 删除: test.txt

$ git commit -m "remove text.txt"

> [master bcfd14e] remove text.txt

1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test.txt

  1. 远程仓库
  2. SSH Key SSH Key为非对称加密的方式,及包含公钥和密钥。公钥存放在git远程服务器,用于校验是否是合法的用户在提交代码。密钥存放在本地,用于解密服务器端传送的数据。
SSH文件在用户的主目录中,我的SSH地址为**/home/adaivskenan/.ssh**。里面有id_rsa和id_rsa.pub两个文件,id_rsa为私钥,id_rsa.pub为公钥。如果没有需要用命令生成:
> $ ssh-keygen -t rsa -C "youremail@example.com

输入命令后不需要其它输入,一直**Enter**就可以
  1. 添加远程仓库
> git remote add origin git@github.com:adaivskenan/com.alex.qin.wechat.git

> git push -u origin maste

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

**关联后**,只要本地做了修改,就可以通过命令将master分支的最新修改推送至远程的github

> $ git push origin master
  1. 从远程库克隆
> git clone git@github.com:adaivskenan/com.alex.qin.wechat.git
  1. 分支管理
  2. 创建分支
![HEAD与master](http://img.blog.csdn.net/20160516211617332)

每次提交master都会向前移动。HEAD并不是指向提交,而是指向master,再由master指向提交。因此HEAD表示当前分支。

![master与dev](http://img.blog.csdn.net/20160516212103756)

新建分支dev,将HEAD指向dev则代表当前分支为dev。

> $ git checkout -b dev

切换到一个新分支 'dev'

上面的命令分解为两条命令即:

> $ git branch dev1

> $ git checkout dev1

切换到分支 'dev1'

**查看当前分支**
> $ git branch
  1. 合并分支
![在dev分支开发](http://img.blog.csdn.net/20160516213540904)

在dev分支上进行开发,commit后dev指向新节点,master并不变

![dev开发完毕切换为master](http://img.blog.csdn.net/20160516214915922)

dev开发完毕切换为master

> git checkout master

![把dev分支的工作成果合并到master分支上](http://img.blog.csdn.net/20160516213641295)

假如我们在dev上的工作完成了,就可以把dev合并到master上。直接把master指向dev的当前提交,就完成了合并:

> $ git merge dev

git merge命令用于合并指定分支到当前分支。

![这里写图片描述](http://img.blog.csdn.net/20160516214545376)

如果将dev删除则又恢复只有master

> $ git branch -d dev

3.解决冲突

假设现在存在master和dev两个分支。dev对readme.txt进行修改后commit。master同时也修改了readme.txt。在dev完成修改需要与master合并的时候出现了conflict。

> $ git merge dev

> 自动合并 readme.txt

冲突(内容):合并冲突于 readme.txt 自动合并失败,修正冲突然后提交修正的结果

**手动修改master后继续commit便可以,dev则可以删除。因为merge的时候dev的内容以及合并到了master中,修改master后只需提交master即可。**

> $ git branch -d feature1

注意事项:

知识记录:

  1. git status查看哪些文件被修改过
  2. git diff可以查看修改内容
  3. HEAD指向的版本就是当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版HEAD~10
  4. 用git log可以查看提交历史,以便确定要回退到哪个版本
  5. git reflog查看命令历史,以便确定要回到未来的哪个版本
  6. git reset --hard commit_id 用来切换版本
  7. git checkout -- file 接丢弃工作区的修改时,将版本库的文件直接取出来,本质就是用版本库中的文件替换工作区的文件
  8. git reset HEAD file 将暂存区的文件丢弃,然后可以进行 git checkout -- file的操作,即可以撤销add操作后的修改
  9. git rm用于删除一个文件,与git add一样将此更新到暂存区,都需要进行git commit的操作,将暂存区合并至版本库
  10. 查看分支:git branch
  11. 创建分支:git branch
  12. 切换分支:git checkout
  13. 创建+切换分支:git checkout -b
  14. 合并某分支到当前分支:git merge
  15. 删除分支:git branch -d
  16. git remote add origin git@server-name:path/repo-name.git:关联一个远程库
  17. git push -u origin master 关联后,使用命令第一次推送master分支的所有内容
  18. git push origin master 每次本地提交后,只要有必要,就可以使用命令推送最新修改
  19. Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
  20. git log --graph --pretty=oneline --abbrev-commit 可以看到分支合并图