Git教程

😎来自最贴心的Git教程👉👉👉 Git教程 - 廖雪峰的官方网站

1.安装
2.版本回退
3.远程仓库
4.分支管理
5.标签管理

1.安装

Mac使用Git,首先安装homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install git

安装完成后,还需要设置用户名,在命令行输入:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

第一步,创建一个版本库非常简单,选个空目录:

$ mkdir learngit
$ cd learngit
$ pwd
/Users/shang/learngit

第二步,把这个目录变成Git可以管理的仓库(.git目录默认是隐藏的,用ls -ah命令可看见):

git init
提示:Initialized empty Git repository in /Users/shang/learngit/.git/

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。(Git自动创建了master分支,默认是提到此分支上的)
把文件修改添加到暂存区 →→ 把暂存区的所有内容提交到当前分支:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files.提交的说明(必填)"

git status命令可以查看当前的修改状态,但是要看具体修改了什么(difference),需要使用git diff

git diff readme.txt    

知道修改了什么,可以放心git add了,不过在执行第二步git commit之前,再运行git status 确认无误后,方可提交,之后再用git status查看(养成细心的好习惯~)。
查看提交的历史记录 (从最近到最远):

git log
或
git log --pretty=oneline

2.版本回退

HEAD表示当前版本:

# 上一个版本就是HEAD^,上上一个版本就是HEAD^^
git reset --hard HEAD^
提示:HEAD is now at 352d83a  xxxxx

如果此时想再回去,需要找到原来的commit_id,不需要写全,git会自动找:

$ git reset --hard 1094a
提示:HEAD is now at 83b0afe xxxx 表示已经反悔成功

为了防止commit_id被忘记,Git记录你的每一次命令:

git reflog

add之前,丢弃工作区的修改(没有--,就变成了“切换到另一个分支”的命令):

git checkout -- readme.txt

把暂存区的修改撤销掉,重新放回工作区:

git reset HEAD readme.txt

本地删除一个文件并提交:

git rm test.txt
git commit -m "remove test.txt"

好啦,以上是对一个文件的基本操作,掌握之后就可以继续学习远程仓库的操作了!

3.远程仓库

使用GitHub
第1步:创建SSH Key,密码不一定和邮箱一致,但要牢记

ssh-keygen -t rsa -C "youremail@example.com"

如果创建了,直接到.ssh下查看, id_rsa是私钥不能泄露,id_rsa.pub是公钥可以告诉任何人:

cat id_rsa.pub

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容(一个字不落的全部复制出来),一台电脑对应一个Key,这样就OK啦~

如果本地创建了一个仓库后,又想在GitHub创建一个仓库,并且让这两个进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,该怎么操作呢?

这种情况必须是空仓库,创建时什么都不要勾选,不然会合并失败!
在本地的KrBase仓库下运行命令:

git remote add origin git@github.com:CoderShang/KrBase.git

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

git push -u origin master

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

git push origin master

把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

如果从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆:

git clone git@github.com:CoderShang/KrBase.git

可以看到,GitHub给出的地址不止一个,还可以用https://xxx,其缺点是:速度慢、每次推送都必须输口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

4.分支管理

我们创建dev分支,然后切换到dev分支:

git checkout -b dev
提示:Switched to a new branch 'dev'
# ``-b``参数表示创建并切换:
git branch dev
git checkout dev
# 可查看当前分支:
git branch

dev分支合并到master分支上:

git merge dev

合并完成后,就可以放心地删除dev分支了:

git branch -d dev
git branch -D dev 强制删除用大写D

当执行merge后Git无法自动合并分支时,就必须手动解决冲突后,再提交
合并分支的log可以使用参数查看:

git log --graph --pretty=oneline --abbrev-commit

如果要强制禁用Fast forward(快进)模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
--no-ff方式的git merge

git merge --no-ff -m "merge with no-ff" dev

有时候工作只进行到一半,没法提交,预计完成还需1天时间。但是,必须在两个小时内修复某个bug,怎么办?
幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,便于以后继续工作:

git stash
# 工作现场列表
git stash list

Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:

git stash pop

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

git stash apply stash@{0}

dev分支上修复bug,然后在master分支上复制一个特定的提交:

git cherry-pick 4c805e2

查看远程库的信息,显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址:

git remote -v
origin  git@github.com:CoderShang/KrBase.git (fetch)
origin  git@github.com:CoderShang/KrBase.git (push)

若本地创建了dev分支,则同步到远端并且指定链接关系:

git push origin dev
git branch --set-upstream-to=origin/dev dev

若本地没有dev,远端有,则创建远程origindev分支到本地:

git checkout -b dev origin/dev

删除本地分支后,使用如下命令删除远端分支:

git push origin --delete dev
git branch -a

多人协作的工作模式通常是这样:
首先,可以试图用git push origin <branch-name>推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

5.标签管理

打一个新标签,可以用命令git tag查看所有标签:

# 打过后查看show:
git tag v1.0
git show v1.0
# 对应的commit id打标签:
git log --pretty=oneline --abbrev-commit
git tag v0.9 f52c633

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

git tag -a v0.1 -m "version 0.1 released" 

注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

如果标签打错了,也可以删除:

git tag -d v0.1

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

如果要推送某个标签到远程,使用命令:

git push origin v1.0
# 或者,一次性推送全部尚未推送到远程的本地标签:
git push origin --tags

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

git tag -d v1.0
git push origin :refs/tags/v1.0

!!!重点说一下:git pull要慎用,最好使用如下命令更新代码:

git fetch
&
git merge

(^-^)好啦~!基本功修炼结束,送大家一条命令作为礼物:

# 运行下面命令后 再运行:git lg ,别名功能简直太便捷了~
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git lg

关于搭建Git服务器请参考:搭建Git - 廖雪峰的官方网站

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