Git教程

2019-08-14  本文已影响0人  CoderShang

😎来自最贴心的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 - 廖雪峰的官方网站

上一篇下一篇

猜你喜欢

热点阅读