git

创建版本库

版本库又名仓库,可以简单的理解为一个目录,目录里所有的文件都可以被管理起来,每个文件的修改删除,git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还原

第一步,选择一个合适的地方,创建一个空目录

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

pwd用于显示当前目录

第二步,通过git init把目录变成git可以管理的仓库

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

把文件添加到版本库

第一步,用git add告诉Git,把文件添加到仓库

git add readme.txt

第二步,用git commit告诉Git,把文件提交到仓库。-m输入的是本次提交的说明,可以方便的从历史记录找到改动记录。commit可以一次提交很多文件

git commit -m "wrote a readme file"

时光穿梭机

修改readme.txt文件。

运行git status查看结果。git status命令可以让我们时刻掌握工作区的状态。

git status告诉你文件有没有被修改过,git diff查看修改内容

版本回退

HEAD指向的版本就是当前版本,HEAD^指向的是当前版本的上一个版本,HEAD^^当前版本的上上个版本……上100个版本写成HEAD~100

版本穿梭使用命令 git reset --hard commit_id, commit_id是版本号

穿梭前,使用git log查看提交历史,以便确定退回哪个版本

要重返未来,用 git reflog 查看命令历史,以便确定回到未来哪个版本

工作区和暂存区

工作区电脑里能看到的目录,比如learning文件夹就是一个工作区

版本库(Repository)

Git版本库存了很多东西,最重要的就是stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针HEAD

第一步,git add把修改及新增的文件添加到暂存区

第二步,git commit提交更改,把暂存区的内容提交到当前分支

在没有自己创建分支的情况下,git commit就是往master分支提交更改

管理修改

git diff HEAD -- readme.txt 查看工作区和版本库最新版本的区别

撤销修改

场景一,修改了工作区的内容,丢弃工作区的修改,使用 git checkout -- file

场景二,修改了工作区的内容,还添加到了暂存区。分两步 git reset HEAD <file>,然后按照场景一继续操作

场景三,已经提交不合适的修改到版本库时,使用 版本回退 ,前提是没有推送到远程仓库

删除文件

方式一,rm file然后 git rm <file> 或者git add <file>,再git commit

方式二,git rm <file> ,再git commit

如果是工作区误删,可以运行 git checkout -- <file>,git checkout是用版本库里的版本替换工作区的版本,无论是修改还是删除,都可以还原 

远程仓库

添加远程仓库

关联远程仓库,使用 git remote add origin git@server-name:path/repo-name.git

关联后,使用 git push -u origin master 第一次推送master分支的所有内容,-u不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来

此后,每次提交直接 git push origin master 推送最新修改

从远程仓库克隆

要克隆一个仓库,首先需要知道仓库的地址,然后使用git clone命令克隆

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快

查看,删除,重命名远程分支

查看远程分支 git branch -a 

本地分支push到远程 git push origin <branch-name>:<branch-name>

删除远程分支 git push origin --delete <branch-name> 或者 git push origin :<branch-name> (推送一个空分支到远程分支,其实就是相当于删除远程分支)

删除远程tag git push origin --delete tage <tag-name> 或者 git tag -d <tag-name> & git push origin :refs/tags/<tag-name>

分支管理

创建与合并分支

第一步,在本地创建dev分支,然后切换到dev分支 git checkout -b dev

git checkout 加上-b参数表示创建并切换,相当于以下两条命令

  git branch dev

  git checkout dev

第二步,git branch 会列出所有分支,当前分支前会标一个*号

第三步,切换回master分支,git checkout master

第四步,合并某分支到当前分支 git merge <name>

第五步,删除分支 git branch -d <name>

解决冲突

Git无法自动合并分支时,必须首先解决冲突,再提交,合并完成。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

git log查看分支历史,git log --graph命令可以看到分支合并图, 后面加上 --pretty=oneline 单行显示历史提交--abbrev-commit

分支管理策略

合并分支时,加上--no-ff参数就可以使用普通合并模式,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来做过合并

Bug分支

修复bug时,会通过创建新的bug分支进行修复,然后合并,最后删除

步骤一,当手头工作没有完成时,先把工作现场 git stash

步骤二,然后切回master分支,从master拉出一个issue分支,修复bug

步骤三,切回工作分支git stash list查看stash内容

步骤四,git stash pop恢复(或者git stash apply恢复,然后git stash drop删除,因为git stash apply不删除stash内容,如果有很多次stash可以使用git stash apply@{0})

Feature分支

开发一个新feature,最好创建一个新分支

如果要丢弃一个没有被合并过的分支,可以通过 git branch -D <name>强行删除

多人协作

查看远程库信息,使用git remote -v

本地新建的分支如果不推送到远程,对其他人就是不可见的

本地推送分支,使用 git push origin branch-name,如果推送失败,先用 git pull抓取远程新的提交

在本地创建和远程分支对应的分支,使用 git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致

建立本地分支和远程分支的关联,使用 git branch --set-upstream branch-name origin/branch-name    git branch --set-upstream-to=<remote-branch-name> <local-branch-name>

从远程抓取分支,使用 git pull,如果有冲突先处理冲突

原文地址:https://www.cnblogs.com/xiaochengzi/p/10033893.html