git基础用法(一)

一、版本控制系统对比

  • 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而大家工作的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始工作,工作完成,再把自己的修订推送给中央服务器。这类系统,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

  • 那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

  • 和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

  • 在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

二、git基础命令应用(配置)

  1. Git 配置
    配置个人名称和邮箱,每次提交时将附带这些信息:使用**git config ** 命令配置

     $ git config --global user.name = '******'
     $ git config --global user.email = '******'
    

然后会在当前用户的家目录创建一个.gitconfig文件,如下:
$ ls -l ~/.gitconfig
-rw-r--r-- 1 user staff 28 12 14 11:25 .gitconfig
$ cat ~/.gitconfig
[user]
name = ******
email = ******
上面的配置文件就是Git全局配置的文件,一般配置方法是git config --global <配置名称> <配置的值>
如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config命令不带 --global 选项来设置. 这会在你当前的项目目录下创建 .git/config,从而使用针对当前项目的配置。

  1. 获得一个git仓库
  • Clone 一个仓库
    为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL). Git能在许多协议下使用,所以Git URL可能以ssh://, http(s)://, git://. 有些仓库可以通过不只一种协议来访问。

      $ git clone https://git.oschina.net/minasia/GitTest.git
    

clone操作完成后,会发现当前目录下多了一个GitTest
文件夹,这个文件夹里的内容就是我们刚刚clone下来的代码。由于当前`gitproject仅是测试项目,里面仅有一个README.md文件。
$ cd GitTest/(master)
$ ls README.md
可以发现在命令提示符$前面多了个(master)。这是由于当前Shell使用的是zsh Shell,zsh会判断当前的目录是否有Git仓库,如果是的话则自动把目前所在的git分支显示在提示符中。Git 分支的概念我们会在稍后介绍。

  • 初始化一个新仓库
    可以对一个已存在的文件夹用下面的命令让它置于Git的版本控制管理之下。
    创建一个文件夹,进入,并执行初始化命令** git init**
    $ mkdir GitInit
    $ cd GitInit
    $ git init
    Initialized empty Git repository in /Users/****/****/GitInit/.git/
    通过ls -la命令会发现project目录下会有一个名叫.git 的目录被创建,这意味着一个仓库被初始化了。可以进入到.git目录查看下有哪些内容。

三、git基础命令应用(工作流程)

git的基本流程如下:
  • 创建或修改文件
  • 使用git add命令添加新创建或修改的文件到本地的缓存区(Index)
  • 使用git commit命令提交到本地代码库(可选,有的时候并没有可以同步的远端代码库)使用git push命令将本地代码库同步到远端代码库

进入我们刚才从git上clone的GitTest目录,分别创建文件file1,file2,file3:

 ~/Test/GitTest  ‹master› $ touch file1 file2 file3
 ~/Test/GitTest  ‹master*› $ echo "content1" >> file1
 ~/Test/GitTest  ‹master*›$ echo "content2" >> file2
 ~/Test/GitTest  ‹master*›$ echo "content3" >> file3
 ~/Test/GitTest  ‹master*›$ ###使用** git status ** 命令查看当前git仓库的状态
 ~/Test/GitTest  ‹master*›$ git status
  On branch master
  Initial commit
  Untracked files:
    (use "git add <file>..." to include in what will be committed)
   file1
   file2
   file3
  nothing added to commit but untracked files present (use "git add" to track)

 ~/Test/GitTest  ‹master*›$ ### 可以发现有三个文件处于untracked状态,下一步用** git add ** 命令将这些文件加入到缓存区中
 ~/Test/GitTest  ‹master*›$ git add file1 file2 file3
 ~/Test/GitTest  ‹master*›$ ### 再次执行** git status ** 查看git状态,发现变化
 ~/Test/GitTest  ‹master*›$ git status
  On branch master
  Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
 new file:   file1
 new file:   file2
 new file:   file3

 ~/Test/GitTest  ‹master*›$ ### 提示已经为commit做好准备,此时可以使用** git diff --cached** 命令查看缓存区中哪些文件被修改了,进去到git diff --cached 页面后需要输入q才可以退出                     
 ~/Test/GitTest  ‹master*›$ git diff --cached                                                             
 ~/Test/GitTest  ‹master*›$ ## 通过命令** git commit -m 'comment: 提交文件' 提交已处理的文件
 ~/Test/GitTest  ‹master*›$ git commit -m "update file" 
  [master (root-commit) 7bcd6cf] update file
   3 files changed, 3 insertions(+)
   create mode 100644 file1
   create mode 100644 file2
   create mode 100644 file3
 ~/Test/GitTest  ‹master›$ ## 需要使用-m添加本次修改的注释,完成后就会记录一个新的项目版本。除了用git add 命令,我们还可以用下面的命令将所有没有加到缓存区的修改也一起提交,但-a命令不会添加新建的文件  
 ~/Test/GitTest  ‹master›$ git commit -a -m 'add files'
    On branch master
    nothing to commit, working tree clean
 ~/Test/GitTest  ‹master›$ git status                                                                          
    On branch master
    nothing to commit, working tree clean
 ~/Test/GitTest  ‹master›$ ## 至此,我们完成了第一次代码提交,这次提交的代码中我们创建了三个新文件。需要注意的是如果是修改文件,也需要使用git add命令添加到缓存区才可以提交。如果是删除文件,则直接使用git rm命令删除后会自动将已删除文件的信息添加到缓存区,git commit提交后就会将本地仓库中的对应文件删除  
 ~/Test/GitTest  ‹master›$ ## 如果本地仓库连接到了远程Git服务器,可以使用下面的命令将本地仓库同步到远程服务器
 ~/Test/GitTest  ‹master›$ git push origin master
    Counting objects: 5, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (5/5), 346 bytes | 0 bytes/s, done.
    Total 5 (delta 0), reused 0 (delta 0)
    To https://git.oschina.net/minasia/GitTest.git
    f8f87cf..a4b1acb  master -> master

三、git基础命令应用(分支与合并)

Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。

一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫 branchTest的分支:

 $ git branch branchTest

运行git branch命令可以查看当前的分支列表,已经目前的开发环境处在哪个分支上:

 $ git branch 
   branchTest
   * master

master 是系统创建的, branchTest 是你刚刚穿件的。切换分支到branchTest中

$ git branch branchTest

且换到新分支后,编辑file1文件,然后添加并提交

$ vi file1
~/Test/GitTest  ‹branchTest*› $ git status
  On branch branchTest
  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:   file1
  no changes added to commit (use "git add" and/or "git commit -a")
~/Test/GitTest  ‹branchTest*› $ git add file1 
~/Test/GitTest  ‹branchTest*› $ git commit -m 'update branchTest file1'  
  [branchTest c5bc27a] update branchTest file1
   1 file changed, 4 insertions(+)
~/Test/GitTest  ‹branchTest› $ git status
  On branch branchTest
  nothing to commit, working tree clean
 ~/Test/GitTest  ‹branchTest›$  git checkout master

切换到master分支下,查看刚才编辑的文件,发现刚才的修改已经不见了,因为刚才的修改是在branchTest分支下操作的,现在切换回了master
分支,目录下的文件都是master分支上的文件了。

现在可以在master分支下再作一些不同的修改:

## 编辑file2 
~/Test/GitTest  ‹master› $ echo 'edit file2' >> file2
~/Test/GitTest  ‹master*› $ cat file2                                                                                                                                                                   
  file2
  edit file2
~/Test/GitTest  ‹master*› $ git add file2 
~/Test/GitTest  ‹master*› $ git commit -m '提交file2'
[master 73568ca] 提交file2
 1 file changed, 1 insertion(+)

这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?

可以通过下面的git merge命令来合并branchTest到主线分支master:

## 在master分支上执行
$ git merge -m 'merge master' branchTest

-m参数仍然是需要填写合并的注释信息。
由于两个branch修改了两个不同的文件,所以合并时不会有冲突,执行上面的命令后合并就完成了。

如果有冲突,比如两个分支都改了一个文件file3,则合并时会失败。如下:

~/Test/GitTest  ‹master›$ ## 编辑file3
~/Test/GitTest  ‹master›$ echo "abc" >> file3 
~/Test/GitTest  ‹master*›$ cat file3 
  file3
  abc
~/Test/GitTest  ‹master*›$ git add file3 
~/Test/GitTest  ‹master*›$ git commit -m 'update file3'
[master 1e9e80a] update file3
   1 file changed, 1 insertion(+)
~/Test/GitTest  ‹master›$ git status
  On branch master
  Your branch is ahead of 'origin/master' by 4 commits.
    (use "git push" to publish your local commits)
  nothing to commit, working tree clean
~/Test/GitTest  ‹master›$ git checkout branchTest
  Switched to branch 'branchTest'
~/Test/GitTest  ‹branchTest›$ ls
  README.md file1     file2     file3
~/Test/GitTest  ‹branchTest›$ cat file3 
  file3
~/Test/GitTest  ‹branchTest›$ echo 'aaaa' >> file3
~/Test/GitTest  ‹branchTest*›$ git add file3 
~/Test/GitTest  ‹branchTest*›$ git commit -m 'update file3'
  [branchTest e817b05] update file3
   1 file changed, 1 insertion(+)
~/Test/GitTest  ‹branchTest›$ git checkout master
  Switched to branch 'master'
  Your branch is ahead of 'origin/master' by 4 commits.
  (use "git push" to publish your local commits)
~/Test/GitTest  ‹master›$ ## 合并分支
~/Test/GitTest  ‹master›$ git merage -m '合并分支' branchTest 
  Auto-merging file3
  CONFLICT (content): Merge conflict in file3
  Automatic merge failed; fix conflicts and then commit the result.
~/Test/GitTest  ‹master*›$ ## 提示合并冲突,失败                                                                                                                                                   
~/Test/GitTest  ‹master*›$ ## 合并失败后,通过 git status 查看状态,会发现file3 显示为both modified , 查看file3的内容                                                                          
~/Test/GitTest  ‹master*›$ cat file3                                                                                                                                                                    
  file3
  <<<<<<< HEAD
  abc
  =======
  aaaa
  >>>>>>> branchTest
~/Test/GitTest  ‹master*›$ ## 可以看到冲突的内容都被添加到了file3中,我们使用vim编辑这个文件,去掉git自动产生标志冲突的<<<<<<等符号后,根据需要只保留我们需要的内容后保存,然后使用git add file3和git commit命令来提交合并后的file3内容,这个过程是手动解决冲突的流程。
~/Test/GitTest  ‹master*›$ vim file3
~/Test/GitTest  ‹master*›$ git add file3 
~/Test/GitTest  ‹master*›$ git commit    
    [master 1f4e771] 合并分支
~/Test/GitTest  ‹master›$ git commit -m 'merge file3'
  On branch master
  Your branch is ahead of 'origin/master' by 6 commits.
  (use "git push" to publish your local commits)
  nothing to commit, working tree clean
~/Test/GitTest  ‹master›$ ## 完成合并后,通过如下命令可以删掉分支                                                                                                                              
~/Test/GitTest  ‹master›$ git branch -d branchTest                                                                                                                                                    
  Deleted branch branchTest (was e817b05).

撒销一个合并
如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:

  $ git reset --hard HEAD^# 查看file3的内容,已经恢复到合并前的master上的文件内容$ cat file3

三、git基础命令应用(日志)

~/Test/GitTest  ‹master› $ ## git log 命令显示所有提交日志
~/Test/GitTest  ‹master› $ git log
~/Test/GitTest  ‹master› $ ## 如果日志记录较长,可通过按键q退出  
~/Test/GitTest  ‹master› $ ## git log 有很多参数,可以使用git help log 查看  
~/Test/GitTest  ‹master› $ ## 日志统计 git log --stat
~/Test/GitTest  ‹master› $ ## 如果用--stat选项使用'git log',它会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录:
~/Test/GitTest  ‹master› $ git log --stat
~/Test/GitTest  ‹master› $ ## 格式化日志, --pretty 参数可以使用n多表现形式,如oneline, short, medium, full, fuller, email 或raw。也可以通过--pretty=format参数定义格式。--graph 选项可以可视化你的提交图(commit graph),会用ASCII字符来画出一个很漂亮的提交历史(commit history)线: 
~/Test/GitTest  ‹master› $ git log --pretty=oneline
~/Test/GitTest  ‹master› $ git log --graph --pretty=oneline
~/Test/GitTest  ‹master› $ $ git log --pretty=format:'%h : %s' --topo-order --graph
~/Test/GitTest  ‹master› $ git log --pretty=format:'%h : %s' --topo-order --graph            
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,626评论 9 163
  • 1.git的安装 1.1 在Windows上安装Git msysgit是Windows版的Git,从https:/...
    落魂灬阅读 12,645评论 4 54
  • 2017年5月28日 星期日 晴 今天的读经班在茹茹奶奶家举行,今天也是小湉湉外婆的生日。小湉湉外婆带了一个蛋糕...
    Q儿阅读 210评论 0 1
  • 最近两周,我借了参加运动会的一个名义(刚确认,我落选了),开始让自己走出舒适圈,尝试去室外晨跑跑步。我不跑步...
    拆拥阅读 192评论 0 0
  • 方正继续怒不可遏地说道 :“罗琳你想想看,那些脑满肠肥的大老板吃的是什么?是一个个无辜失去生命的胎儿,这些可怜的孩...
    长白居士阅读 196评论 0 0