Git学习笔记:
git difffilename 结果解析:
---代表源文件
+++代表目标文件
通常working area的文件都是被当作目标文件来看待。
- -开头的行,是只出现在源文件中的行
- +开头的行,是只出现在目标文件中的行
- 空格开头的行,是源文件和目标文件中都出现的行
- 差异按照差异小结进行组织,每个差异小结的第一行都是定位语句,由@@开头,@@结尾。
举例:
chenshu@chenshu-yangzhou-home:~/kaimei/data_service/src$git diff 0c5ee16a6a4c849d0ae0448caa8ff174399c7c3c ./socket_helper.cpp
diff --git a/data_service/src/socket_helper.cpp b/data_service/src/socket_helper.cpp
index d606452..047e213100755
--- a/data_service/src/socket_helper.cpp
+++ b/data_service/src/socket_helper.cpp
@@ -4,6+4,7 @@
#include"data/login_response.h"
#include"data/heartbeat_response.h"
#include"helper/parser.h"
+#include"helper/time_measure.h"
#include<booster/log.h>
#include"exception/socket_error.h"
#include"exception/data_error.h"
上面的diff结果表明
1.某个提交记录0c5ee代表的socket_helper.cpp文件是源文件,当前working area的socket_helper文件是目标文件。
2.在源文件第4行开始的6行和目标文件第4行开始的7行构成一个差异小结
3.这个差异小结中,目标文件添加了一行#include “helper/time_measure.h”
4.其他空格开头的行表明没有差异。
Git status用于查看仓库当前的状态。
Git log 查看日志信息,显示从最近到最远的提交的日志信息。
版本回退:git reset –hard HEAD^,回退到上一个版本。HEAD表示当前的版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,
如果想回到自己制定的那个版本,可以先找到对应版本的
commit id
号
,
然后
git reset –hard +commit id就可以了。
工作区和暂存库:
工作区:就是你在电脑里能看到的目录,就是gitinit后的那个目录。
版本库:工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
工作区,暂存区的关系图解:
git add 后,
Git commit 后,
提交到远程库:
git remote add origin 远程库地址
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库
git push –u origin分支名(master,dev),把本地库的内容推送到远程,用git push
命令,由于远程库是空的,我们第一次推送分支时,加上了-u
参数,Git不但会把本地的分支内容推送的远程新的分支,还会把本地的分支和远程的分支关联起来,在以后的推送或者拉取时就可以简化命令。省去-u参数。
查看git用户名和邮箱:gitconfig user.name ; git config user.email
修改git用户名和邮箱:
修改用户名: gitconfig --global user.name "用户名"
修改邮箱:git config--global user.emai “邮箱”
git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置。
推送新的本地分支到远程:git push origin2新分支名
克隆远程库代码到本地:进入到本地库的目录,gitclone 远程库地址,就可以克隆岛本地对应的目录里。
删除本地仓库中的文件,并且push到远程:
本地仓库:A和B
服务器:C
今天在本地仓库A希望删除一个文件test,于是执行以下命令:
1 2 3 4 | $ sudo rm test $ git add . $ git commit -m "delete test" $ git push origin |
在本地仓库检查,的确没有文件test了。然后再次从服务器拉下来看看,执行
1 | $ git pull |
test没有啦。我以为成功了。
但是在另一个客户端的本地仓库B拉下来,发现test又出来了。看来我以为的不是我以为的。
后来自己查资料,发现:
git add 表示 add to index only files created or modified and not those deleted
git add 只将新建的或者已更改的文件添加到索引区。(不会添加删除的文件)
但是我们现在是通过先rm的命令,那应该如何完成提交,并真正从服务端删除呢:
git add -u
git add -u 这个命令的意思是 add to index only files modified or deleted and not those created
只会处理已修改或者已删除的文件,但是不会处理新建的文件
好了,执行以下命令:
1 2 3 | $ git add -u $ git commit -m "delete test" $ git push |
这时候我们在本地git status发现,已经没有了那些提交信息。再去本地仓库B看看,
test也没有了!
总结:如果我们要彻底通过git删除,分两种方式,如果先执行rm 命令去删除就可以使用本文的方法。
如果想通过git,可以使用git rm命令。
删除分支:
(1) 删除本地分支:在master分支下,gitbranch –d 删除分支;
(2) 删除远程分支:gitpush 远程库名:分支名。
删除远程仓库:$ git remote rm 远程仓库名
远程仓库重命名:
在新版 Git 中可以用 gitremote rename 命令修改某个远程仓库在本地的简称,比如想把 pb 改成paul,可以这么运行:
$ git remote rename pb paul
查看远程仓库的信息:可以通过命令 git remote show[remote-name] 查看某个远程仓库的详细信息,比如要看所克隆的 origin 仓库,可以运行:
$ git remote show origin
从远程获取最新版本到本地:
使用如下命令可以在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支,git fetch origin master:temp
比较本地仓库与下载的temp分支
使用如下命令来比较本地代码与刚刚从远程下载下来的代码的区别:git diff temp
合并temp分支到本地的master分支
对比区别之后,如果觉得没有问题,可以使用如下命令进行代码合并:git merge temp
删除temp分支
如果temp分支不想要保留,可以使用如下命令删除该分支:$ gitbranch -d temp
如果该分支的代码之前没有merge到本地,那么删除该分支会报错,可以使用Git branch-D temp强制删除该分支。这样,我们把远程仓库代码更新到本地了
Git fetch和git pull的区别
2013-03-04 10:58 58514人阅读 评论(4) 收藏 举报
Git中从远程的分支获取最新的版本到本地有这样2个命令:
1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge
Git fetch origin master
git log -p master..origin/master
git merge origin/master
以上命令的含义:
首先从远程的origin的master主分支下载最新的版本到origin/master分支上
然后比较本地的master分支和origin/master分支的差别
最后进行合并
上述过程其实可以用以下更清晰的方式来进行:
gitfetch origin master:tmp
gitdiff tmp
gitmerge tmp
从远程获取最新的版本到本地的test分支上
之后再进行比较合并
2. git pull:相当于是从远程获取最新版本并merge到本地
gitpull origin master
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并