Git一个先进的分布式版本控制系统

简介

分布式版本控制系统与集中式版本控制系统最大的区别就是它没有“中央服务器”;每个人的电脑上都是一个完整的版本库,同事之间只需要将自己的修改推送给对方,就可以互相看到对方的修改了。

不过在实际使用Git的时候,其实很少在两个人之间的电脑互推。通常也有一台充当“中央服务器”的电脑,这个服务器仅仅是用来方便同步大家的修改。

安装Git

因为Xcode自带的有Git所以就不在介绍了。

创建版本库(repository)

git init   #创建一个空的仓库

注:init后用ls -ah命令可以看到当前目录下多了一个.git隐藏目录。这个目录是Git用来跟踪管理版本库的,不要随意手动修改这个目录里的任何文件。

把文件添加到版本库(add)

git add .   #把当前目录下的所有文件添加到仓库

注:add只是把文件修改添加到暂存区

把文件提交到仓库(commit)

git commit -m "日志消息"

注:commit是把暂存区里的修改提交到当前分支

查看版本库当前的状态(status)

git status

查看文件修改(diff)

git diff README.md
git diff HEAD -- README.md   #查看README.md文件在工作区和版本库里面最新版本的区别

查看历史记录(log)

git log   #显示从最近到最远的提交日志
git log --pretty=oneline #只显示版本号和修改内容

回退版本(reset)

git reset --hard HEAD^    #回退到上一个版本

#注:当你回退到了某个版本后,又想恢复到新版本怎么办?想回到新版本必须找到新版本的版本号。我们可以用`git reflog`来查询。
git reflog                #查询每次提交的id
git reset --hard 3637964  #3637964是最新版本的版本号

撤销暂存区的修改(reset)

git reset HEAD README.md    #把暂存区的修改撤销掉,重新放回工作区

撤销工作区的修改(checkout)

git checkout -- README.md    #把README.md文件在“工作区”的修改全部撤销

#注:`--`一定要有,没有`--`就变成了“切换到另一个分支”的命令

删除文件(rm)

git rm README.md            #删除暂存区、工作区和分支上的文件
git rm --cached README.md   #删除暂存区和分支上的文件;工作区里的文件保留

远程仓库1-配置SSH Key:以GitHub为例

由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:

第1步:创建SSH Key。在用户主目录下Finder前往~/.ssh,看看有没有.ssh目录如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到第2步。如果没有就用以下命令创建

ssh-keygen -t rsa -C "youremail@example.com" #把邮件换成你自己的邮件地址,然后一路回车,无需设置密码

#注:`.ssh`里有`id_rsa `和`id_rsa.pub `两个文件,`id_rsa `是私钥不能泄露出去,`id_rsa.pub `是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Settings”,“SSH and GPG keys”页面:然后,点“New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:然后点击“Add SSH Key”,你就应该看到已经添加的Key:

远程仓库2-关联和推送:以GitHub为例

情景:我们先有本地Git仓库,后有远程仓库,需要将本地和远程仓库关联。

第1步:关联远程仓库(假如你在GitHub上已经新建了一个仓库LearnGit)。

git remote add origin git@github.com:leo-lp/LearnGit.git

#注:把上面的`leo-lp`替换成你自己的GitHub账户名。

第2步:把本地库的所有内容推送到远程库。

git push -u origin master    #把当前分支master推送到远程

#注:`-u`不但会把本地的master推送到远程master分支,还会把本地的master和远程的master关联起来。第一次推时需要,以后再推/拉时就可以简化了。

第一次推送有可能报以下错误:

leodeMacBook-Pro:LearnGit leo$ git push -u origin master
To github.com:leo-lp/LearnGit.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:leo-lp/LearnGit.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
leodeMacBook-Pro:LearnGit leo$ 

造成这个错误的原因是Git仓库中已经有一部分代码,所以它不允许你直接把你的代码推送上去。于是我们有2个选择方式:
1.强推,用你本地的代码替代Git仓库内的内容:

git push -f origin master #注:会覆盖远程仓库里的内容

2.把服务器上的内容合并到本地在推送:git pull可是这时又报错了。

leodeMacBook-Pro:LearnGit leo$ git pull
fatal: refusing to merge unrelated histories
leodeMacBook-Pro:LearnGit leo$

这时我们需要用以下两个命令配置.git/config文件:

git config branch.master.remote origin           #当本地是masterf分支, 默认的remote就是origin
git config branch.master.merge refs/heads/master #当本地是master分支使用git pull时,没有指定remote分支,那么git就会采用默认的origin来merge在master分支上所有的改变

这时我们已经可以正常的pullpush了。完整操作如下:

leodeMacBook-Pro:LearnGit leo$ git config branch.master.remote origin
leodeMacBook-Pro:LearnGit leo$ git config branch.master.merge refs/heads/master
leodeMacBook-Pro:LearnGit leo$ git pull
Already up-to-date.
leodeMacBook-Pro:LearnGit leo$ git push origin master
Counting objects: 26, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (21/21), done.
Writing objects: 100% (26/26), 12.68 KiB | 0 bytes/s, done.
Total 26 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To github.com:leo-lp/LearnGit.git
   f01930f..0892bfe  master -> master
leodeMacBook-Pro:LearnGit leo$ 

远程仓库3-克隆:以GitHub为例

情景:我们需要从零开发,那么最好的方式是先创建远程仓库,然后克隆。

第1步:登录GitHub新建一个仓库LearnGit。
第2步:克隆到本地:

git clone git@github.com:leo-lp/LearnGit.git

分支管理1-创建/切换分支(branch/checkout)

git branch MyBranch        #创建分支MyBranch
git checkout MyBranch      #切换到分支MyBranch
git checkout -b MyBranch   #创建并切换到分支MyBranch

分支管理2-删除/查看分支(branch)

git branch -d MyBranch  #删除MyBranch分支
git branch              #查看当前分支

分支管理3-合并分支/解决冲突(merge)

git merge MyBranch                                  #将MyBranch合并到当前分支
#注:如果可能Git会用Fast forward模式,这种模式下删除分支后,会丢掉分支信息。

git merge --no-ff -m "merge with no-ff" MyBranch    #将MyBranch合并到当前分支
#注:`--no-ff`强制禁用Fast forward模式,Git会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
leodeMacBook-Pro:LearnGit leo$ git checkout master  #切回master分支
leodeMacBook-Pro:LearnGit leo$ git merge MyBranch   #将MyBranch合并到master
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
leodeMacBook-Pro:LearnGit leo$

合并分支时README.md文件发生冲突,必须手动解决冲突后再commit。
git status也可以查看冲突的文件:

leodeMacBook-Pro:LearnGit leo$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
leodeMacBook-Pro:LearnGit leo$ 

打开README.md文件查看内容:

class ScanViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
<<<<<<< HEAD
        print("Master -> viewDidLoad")
=======
        print("MyBranch -> viewDidLoad")
>>>>>>> MyBranch
    }
}

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:

class ScanViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        print("Master -> viewDidLoad")
    }
}

再提交

git add README.md                #添加到暂存区
git commit -m "conflict fixed"   #提交到master分支

分支管理5-查看分支的合并情况(log)

git log --graph                                   #查看分支合并图
git log --graph --pretty=oneline --abbrev-commit  #查看本次分支的合并情况
leodeMacBook-Pro:LearnGit leo$ git log --graph --pretty=oneline --abbrev-commit
*   6deee3e Fix conflicts
|\  
| * de23acd MyBranch
* | 76c6451 master
|/  
* 873c772 ..
leodeMacBook-Pro:LearnGit leo$ 

分支管理6-创建BUG分支(stash)

情景:当你接到一个修复紧急bug的任务时,需要创建一个分支来工作。但是,你当前正在MyBranch分支上进行工作,而且工作只进行到一半还没法提交。
这时,我们就需要用stash功能,将当前工作现场“储藏”起来,等bug解决了再恢复现场继续工作。

git stash    #把当前工作现场“储藏”起来

#注:`stash`后,用`git status`查看工作区是干净的,因此可以创建分支来修复bug了。
  • 创建bug分支 -> 解决bug -> 解决完毕 -> 合并到主分支 -> 删除bug分支

当bug解决完毕后需要切回到原来的MyBranch分支继续工作:

git checkout MyBranch  #切回到MyBranch分支
git stash list         #查看被储藏的工作区

git stash apply stash@{0}       #恢复指定的工作区
git stash drop stash@{0}        #删除指定的stash内的记录
or
git stash pop stash@{0}         #恢复的同时把stash内的指定记录也删了

分支管理7-推送分支(push)

git remote        #查看远程仓库的信息
git remote -v     #查看远程仓库的更详细信息

git push origin master   #将本地master分支推送到远程库对应的远程分支
git push origin MyBranch #将本地MyBranch分支推送到远程库对应的远程分支

分支管理8-获取分支(pull)

pull之前必须要先克隆:

git clone git@github.com:leo-lp/LearnGit.git

注:此时你只能看到本地的master分支,如果你想看到其他分支必须创建远程origin的MyBranch到本地:

git checkout -b MyBranch origin/MyBranch

抓取分支

git pull    #把最新的提交从origin/dev抓下来

#注:第一次抓取的时候有可能会报以下错误:
remote: Counting objects: 1, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0)
Unpacking objects: 100% (1/1), done.
From github.com:leo-lp/LearnGit
   fc338631..201bea8  MyBranch        -> origin/MyBranch
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 dev origin/<branch>

这是因为本地MyBranch分支与远程origin/MyBranch分支没有关联,根据提示设置关联:

git branch --set-upstream MyBranch origin/MyBranch   #设置MyBranch和origin/MyBranch的链接

标签管理1-创建标签(tag)

git tag v1.0   #打一个标签v1.0
git tag        #查看所有标签

对历史提交的版本打一个标签

git log --pretty=oneline --abbrev-commit     #找到历史提交的commit id
git tag v1.0 6279237                         #对commit id为6279237的版本打标签
git tag                                      #查看所有标签
git tag -a v1.0 -m "version 1.0 released"    #创建带有说明的标签
#注:`-a`指定标签名,`-m`指定说明文字。

git show v1.0    #查看标签v1.0的信息

标签管理2-操作标签(tag)

git push origin v1.0     #将标签v1.0推送到远程
git push origin --tags   #将全部尚未推送的标签推送到远程
git tag -d v1.0                   #删除本地标签v1.0
git push origin :refs/tags/v1.0   #删除远程标签v1.0

Git的常用配置

git config --global color.ui true    #让Git在适当的地方显示不同的颜色

配置别名:

git config --global alias.co checkout  #为checkout配置别名co
git config --global alias.ci commit    #为commit配置别名ci
git config --global alias.br branch    #为branch配置别名br
git config --global alias.st status    #为status配置别名st

忽略特殊文件(.gitignore)

在Git工作区的根目录下创建一个.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
GitHub也为我们准备了各种配置文件:https://github.com/github/gitignore

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

推荐阅读更多精彩内容