Git常用操作
- 提交新文件
第一步添加文件:git add readme.txt //文件必须在git的仓库目下
第二步提交变动:git commit readme.txt //或者 git commit readme.txt -m “添加readme.txt文件,这里必须写入说明”
- 提交修改
- git status命令查看仓库当前的状态
位于分支 master
尚未暂存以备提交的变更:
(使用 “git add <文件>…” 更新要提交的内容)
(使用 “git checkout – <文件>…” 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 “git add” 和/或 “git commit -a”)
- git diff查看difference
$ 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 add ×× 命令添加文件至仓库,git status查看状态
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 “git add <文件>…” 更新要提交的内容)
(使用 “git checkout – <文件>…” 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 “git add” 和/或 “git commit -a”)
- git commit ×× -m “说明” 将文件提交。git status 查看仓库的当前状态
$ git status
位于分支 master
无文件要提交,干净的工作区
- git 回到历史版本
- git log 查看记录
$ 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^ 用来回到上一个版本
$ git reset --hard HEAD^
HEAD 现在位于 cdd5994 添加改动
$ git log --pretty=oneline
cdd599457423fa678fbbafad3fafc78dc827b0da 添加改动
bbd0121be8fab4cfbe49554bc65ffa732ffa9796 提交了我的第一个readme,这里是本次提交的说明
- git 重返未来
- git reflog 查看命令历史
$ 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 commit_id 回到未来
$ git reset --hard 1c71f83
HEAD 现在位于 1c71f83 第二次修改
$ git log --pretty=oneline
1c71f838147fe1ccba9d271b6e887d69e1953150 第二次修改
cdd599457423fa678fbbafad3fafc78dc827b0da 添加改动
bbd0121be8fab4cfbe49554bc65ffa732ffa9796 提交了我的第一个readme,这里是本次提交的说明
- 撤销文件
- 撤销工作区文件
$ 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后添加
- 撤销缓存区文件
$ 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后添
- 撤销版本库文件(没有进行push到远程库的操作)
参考**git 回到历史版本**,先将HEAD指向历史版本
- 删除文件
- 文件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
无文件要提交,干净的工作区
- 文件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
- 远程仓库
- 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**就可以
- 添加远程仓库
> 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
- 从远程库克隆
> git clone git@github.com:adaivskenan/com.alex.qin.wechat.git
- 分支管理
- 创建分支

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

新建分支dev,将HEAD指向dev则代表当前分支为dev。
> $ git checkout -b dev
切换到一个新分支 'dev'
上面的命令分解为两条命令即:
> $ git branch dev1
> $ git checkout dev1
切换到分支 'dev1'
**查看当前分支**
> $ git branch
- 合并分支

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

dev开发完毕切换为master
> git checkout master

假如我们在dev上的工作完成了,就可以把dev合并到master上。直接把master指向dev的当前提交,就完成了合并:
> $ git merge dev
git merge命令用于合并指定分支到当前分支。

如果将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
注意事项:
- git分支没有主次之分,master叫主分支其实和别的分支完全一样
知识记录:
- git status查看哪些文件被修改过
- git diff可以查看修改内容
- HEAD指向的版本就是当前版本,上一个版本就是HEAD,上上一个版本就是HEAD^,往上100个版HEAD~10
- 用git log可以查看提交历史,以便确定要回退到哪个版本
- git reflog查看命令历史,以便确定要回到未来的哪个版本
- git reset --hard commit_id 用来切换版本
- git checkout – file 接丢弃工作区的修改时,将版本库的文件直接取出来,本质就是用版本库中的文件替换工作区的文件
- git reset HEAD file 将暂存区的文件丢弃,然后可以进行 git checkout – file的操作,即可以撤销add操作后的修改
- git rm用于删除一个文件,与git add一样将此更新到暂存区,都需要进行git commit的操作,将暂存区合并至版本库
- 查看分支:git branch
- 创建分支:git branch
- 切换分支:git checkout
- 创建+切换分支:git checkout -b
- 根据远程分支创建: git checkout -b
eg: git checkout -b hotfix/J001 remotes/origin/hotfix/J001
- 合并某分支到当前分支:git merge
- 删除分支:git branch -d
- git remote add origin git@server-name:path/repo-name.git:关联一个远程库
- git push -u origin master 关联后,使用命令第一次推送master分支的所有内容
- git push origin master 每次本地提交后,只要有必要,就可以使用命令推送最新修改
- Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
- git log --graph --pretty=oneline --abbrev-commit 可以看到分支合并图