Git的基本使用

Git的基本使用

关于Git官网提供的《pro git》应该是最全面,最权威的使用手册了。关于Git的具体概念,来源,使用等都可以去里查阅学习。本文的目的是从零开始以演示Git在实际项目中的一些基本应用,以帮助读者快速上手。

本文默认读者数量使用window系统且对命令行操作有一定了解。

要完成的文章内容:

  • Git的安装
  • Git本地仓库的建立
  • Git克隆,拉取,合并,推送
  • Git分支创建,分支之间的合并
  • Git远程仓库,远程分支拉去,本地和远程的对应关系,本地与远程的对应关系绑定
  • 笔记里面其他的关于Git命令
  • git stash 保存修改的东西到缓存,然后拉去代码之后再把缓存的东西释放出来

Git安装

点击查看原文

在Linux上安装

如果要在 Linux 上安装预编译好的 Git 二进制安装包,可以直接用系统提供的包管理工具。在 Fedora 上用 yum 安装:

$ yum install git-core

在 Ubuntu 这类 Debian 体系的系统上,可以用 apt-get 安装:

$ apt-get install git

在Mac上安装

在 Mac 上安装 Git 有两种方式。最容易的当属使用图形化的 Git 安装工具,界面如图 1-7,下载地址在:

http://sourceforge.net/projects/git-osx-installer/
img

另一种是通过 MacPorts (http://www.macports.org) 安装。如果已经装好了 MacPorts,用下面的命令安装 Git:

$ sudo port install git-core +svn +doc +bash_completion +gitweb

这种方式就不需要再自己安装依赖库了,Macports 会帮你搞定这些麻烦事。一般上面列出的安装选项已经够用,要是你想用 Git 连接 Subversion 的代码仓库,还可以加上 +svn 选项,具体将在第八章作介绍。(译注:还有一种是使用 homebrew(https://github.com/mxcl/homebrew):brew install git。)

在Windows上安装

在 Windows 上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行:

http://msysgit.github.com/

完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。

Git的基本操作

注意:以下演示用git对txt文档进行版本的跟踪,每次对txt文件修改或者回滚后注意跟新txt内容。建议使用notpad打开txt文件,它会自动监控内容改变并且提示更新。

本地仓库操作示例

初始化新仓库

在D盘根目录创建名称为git的文件夹,接下来把该文件夹做成本地的git仓库并进行一些基本的操作。

安装好git软件之后,进入git文件夹,在空白处点击鼠标右键,选择Git Bash Here.

执行:

zhangmumu@zhangmumu MINGW64 /d/git
$ git init
Initialized empty Git repository in D:/git/.git/  # 这里显示新增了.git文件

初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。

查看状态

当前目录建立文件git-test.txt里面录入内容:first Content。如上该文件第一次编辑结束,保存一下。

执行:

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status    # 查看目前状态(status)经常使用的命令
On branch master    #目前所在分支,处于master主分支,后续会提到分支的操作

No commits yet  #目前没有任何提交(commits)

Untracked files:    #提示有文件没有跟踪,并且提示下一步怎么操作
  (use "git add <file>..." to include in what will be committed)

        git-test.txt

nothing added to commit but untracked files present (use "git add" to track)

增加跟踪

执行:

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git add git-test.txt

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   git-test.txt

执行git add *之后并没有返回。再执行git status查看当前状态,状态中可以看到新增了一个文件,等待提交(commit),并且提示可以通git rm --cached <file>去unstage该文件。

stage直接翻译是阶段的意思,git中的stage我理解成暂存,add文件之后是加入了git的暂存区。

提交文件

执行:

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git commit -m "fist-commit"       #提交命令,-m 之后的字符串是对本次提交的备注内容
[master (root-commit) 7368c19] fist-commit
 1 file changed, 1 insertion(+)     #显示文件增加了一行内容
 create mode 100644 git-test.txt    

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
nothing to commit, working tree clean

git commit -m " "提交命令,-m之后是输入对本次提交的备注内容。

提交记录

查看提交的记录,执行:

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git log
commit 7368c19dc88ca2062b3c24a25334a9ce04824b2c (HEAD -> master)
Author: zhangmumu 
Date:   Sat Sep 8 08:48:34 2018 +0800

    fist-commit

以上显示目前仅仅有一次提交内容。

舍弃修改

在日常文件编辑中,有时候想放弃当前修改回到当前git版本中样子。git-test.txt文件中的做任意的修改,修改之后想放弃这次修改。

执行:

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status    #查看状态可以看到文件有修改内容
On branch master
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:   git-test.txt

no changes added to commit (use "git add" and/or "git commit -a")

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git checkout *    # 撤销当前修改,git是支持正则的

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status    #再次查看状态,干净的,修改已经被撤销
On branch master
nothing to commit, working tree clean

如果文件已经增加到了stage(暂存区),怎么回滚?再次对文档进行任意修改,执行:

#   修改文件后查看状态
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status    
On branch master
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:   git-test.txt

no changes added to commit (use "git add" and/or "git commit -a")
#   文件add增加到暂存区
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git add *.txt
#   再次查看状态
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   git-test.txt

#   git rest HEAD 命令将暂存区的文件unstage撤出暂存区
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git reset HEAD *
Unstaged changes after reset:
M       git-test.txt
#   再次查看状态,文件已经撤出暂存区域,checkout一下就可以撤销本次修改了
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
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:   git-test.txt

no changes added to commit (use "git add" and/or "git commit -a")

以上的操作消化吸收之后,基本上是入门了。下面做一个服务器仓库的实际操作。

远程服务器操作

目前很多网站提供git平台进行代码托管的,这里推荐码云它的文档中说的很详细了。码云提供的GIT大全包含了Git插件、客户端、浏览器插件、文档、常用指令等等。

在日程使用中,感觉远程服务器拉去代码与本地操作相比较多了pushpull操作,前者是将本地的代码推送到远程服务器,后者是将远程的代码拉去到本地。

基本配置

码云中Git的基本配置说的很明白,本地配置用户名和邮箱之后需要生成并部署SSH KEY用来让远程项目识别你的访问权限,每台电脑会生成自己的key,将key加入到自己的账号设置之后,电脑有访问远程服务器的权限。

拉取远程代码

通常远程代码地址有两种

  • HTTPS的,类似这样:https://gitee.com/zhangmumu_star/[项目名称].git
  • SSH的,类似这样:git@gitee.com:zhangmumu_star/[项目名称].git

建议使用SSH地址,HTTPS拉去的时候需要输入自己的码云账号和密码,而SSH则不需要。

在本地建立好工作目录之后,打开git bash,拉去代码命令:

$ git clone git@gitee.com:zhangmumu_star/[项目名称].git

建立本地分支

建立本地分支且切换到本地分支:

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (master)
$ git checkout -b zz    #建立本地分支并且切换到该分支命令
Switched to a new branch 'zz'

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch #查看分支,目前已经在zz分支上面
  master
* zz

分支合并

刚刚从master分支中建立的分支zz是跟master一模一样的。

如果A分支跟B分支内容上有不一样的话,希望把B分支内容跟A分支合并。那么就切换到B分支然后执行合并命令:

git checkout B  #切换到B分支
git merge A #目前位于B分支,mergeA的意思就是把A分支内容合并到B分支

查看本地分支与远程分支映射关系

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv
  master 5cdaf1a [origin/master] commit
* zz     5cdaf1a commit

映射关系命令为:Git branch -vv。其中返回结果中origin表示远程的意思,本地的master分支与远程的master分支是有映射关系的。本地的zz分支并没有与远程的分支有映射关系。

将本地分支推送到远程

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git push origin zz:zz     #将本地分支推送到远程
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by Gitee.com
To gitee.com:zhangmumu_star/framwork_test.git
 * [new branch]      zz -> zz

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv        #查看对应关系
  master 5cdaf1a [origin/master] commit
* zz     5cdaf1a commit

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -a     #查看远程分支
  master
* zz
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/zz

可以看到本地分支已经推送到了远程,但是本地分支跟远程分支并没有映射关系。没有映射关系的时候在推送和拉去代码的时候必须指定好本地分支和远程分支,如下:

 git pull <remote> <branch>     #制定本地分支和远程分支
 git push <remote> <branch>

指定的意思就是,把本地分支<branch>推送到远程分支<remote>中。反向拉去的时候意思一样。

建立映射关系

在本地分支和远程分支没有映射关系的时候拉去代码会有如下提示:

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> zz

建立映射关系:

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -u origin/zz       #建立映射关系
Branch 'zz' set up to track remote branch 'zz' from 'origin'.

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv        #查看映射关系
  master 5cdaf1a [origin/master] commit
* zz     5cdaf1a [origin/zz] commit

此外也可以使用上面提示的语句建立映射关系:

git branch --set-upstream-to=origin/<branch> zz
# 上面的<branch>指的是远程分支的名,zz指的是本地分支名

拉取到本地

在已经克隆了代码并且做好映射关系之后,将代码拉取到本地的方法:

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git pull
Already up to date.

提交到远程

跟本地<a href="#提交文件">提交文件</a>的区别是,在依次执行完add,commit命名之后需要执行push命令来将本地的代码提交到远程。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容