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
,远端有,则创建远程origin
的dev
分支到本地:
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 - 廖雪峰的官方网站