关于Git的一些操作

一、Git 基本操作---命令式   

1、git init --- 创建新的本地化Git仓库

git init

项目生成 .git 子目录,这就是项目的Git仓库了,所有有关此项目的快照数据都存放在这里。

图1.1

2、git clone --- 远程Git仓库本地化

拷贝远程Git仓库到本地,方便开发人员查看、修改项目源码。

git clone [url] --- 例如: git clone https://github.com/1218683832/BubbleCast.git

git clone [url]  [refilename] ---  例如: git clone https://github.com/1218683832/BubbleCast.git loaclBubbleCast

默认情况下,Git会按照你提供的URL所指示的项目的名称创建你的本地项目目录。 通常就是该 URL 最后一个 / 之后的项目名称。如果你想要一个不一样的名字, 你可以在该命令后加上你想要的名称。

图1.2

3、git add --- 添加文件到仓库

用命令git add告诉Git,把文件添加到仓库:

git add 【filename+后缀】--- 例如:git add readme.txt,可反复多次使用,添加多个文件

git add --a 或者 git add --all --- 添加所有文件

4、git commit --- 把文件提交到仓库

git commit -m 【本次提交说明】--- 例如:git commit -m "wrote a readme file"

-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样就能从历史记录里方便地找到改动记录。

5、git status --- 随时掌握仓库当前状态

例如:在哪个分支上,提交状态,修改状态,冲突等等。

6、git diff --- 查看difference,能看文件具体修改了什么内容

git diff 【filename+后缀】--- 例如:git diff readme.txt

7、git log --- 显示从最近到最远的提交日志,查看提交历史

git log

如果嫌输出信息太多,可以试试加上--pretty=oneline参数,git log --pretty=oneline

git log --graph命令可以看到分支合并图

8、git reflog --- 查看命令历史

9、git checkout 【分支名】--- 切换到另一个分支

    git checkout  -b【分支名】--- -b参数表示创建并切换分支,创建+切换分支

    git checkout -b 【分支名】 origin/【分支名】--- 创建+切换分支,在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致

10、git branch --- 查看分支,会列出所有分支,当前分支前面会标一个*号

    git branch 【分支名xxx】--- 创建xxx分支

    git branch -d 【分支名xxx】 --- 删除xxx分支

    git branch --set-upstream 【分支名xxx】 origin/【分支名xxx】--- 建立本地分支和远程分支的关联

11、git merge 【分支名xxx】--- 合并xxx分支到当前分支

12、git stash --- 把当前工作现场“储藏”起来,等以后恢复现场后继续工作

    git stash list --- 查看存储的工作现场列表

    git stash apply 【stash@{0}】--- 恢复工作区,但是恢复后,stash内容并不删除,你需要用git stash drop来删除

    git stash pop --- 恢复工作现场的同时把stash内容也删了

13、git remote -v --- 查看远程库信息

    git pull --- 抓取远程的新提交,如果有冲突,要先处理冲突

二、Git远程仓库

git remote add 【远程库名】 【远程仓库地址】---关联(本地仓库到)远程库

情景,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步。

步骤:

1、登陆GitHub,创建一个新的仓库:newgitname

2、把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。

在本地的learngit仓库下运行:git remote add origin git@github.com:yougithubname/newgitname.git

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

3、把本地库的所有内容推送到远程库上:

git push -u 【远程库名】【当前本地库名】--- 例如:git push -u origin master

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

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地

的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

以后,只要本地作了提交,就可以通过命令:git push origin master 把本地master分支最新修改推送至远程库origin。


三、版本回退&回到未来版本

文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

1、首先,git log 可以查看commit id(版本号)

2、现在,我们要把当前版本回退到上一个版本,有两种方法reset、revert

方法一:git reset

适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。

原理: git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。

具体操作:

1、使用git reset命令:git reset --hard HEAD^,继续命令还可以继续回退到上一个版本;

使用git reset --hard 【commit id】让HEAD指向哪个commit id(版本号),就把当前版本定位在哪,只要知道commit id。

2、此时如果用git push会报错,因为我们本地库HEAD指向的版本比远程库的要旧,使用git push -f强制提交更改;

方法二:git revert

适用场景: 如果我们想恢复之前的某一版本(该版本不是merge类型),但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就

可以用这种方法。

原理: git revert的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版

本,而不是目标版本。

具体操作:

1、使用git revert -n 【commit id】反做;

注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。

2、使用git commit -m 【revert to commit id】提交;

3、使用git push推上远程库


四、工作区和暂存区概念

1、工作区(Working Directory)

就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区。

2、版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。这些都是存储在本地仓库。

git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。这些都是针对本地仓库的操作。


五、撤销修改&删除文件

1、撤销修改:git checkout -- 【filename+后缀】--- 可以丢弃工作区的修改,让这个文件回到最近一次git commit或git add时的状态。

例如:命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

2、删除文件:git rm -f 【filename+后缀】--- 强制删除该文件,包括版本库,强制同步工作区&版本库。

六、分支管理

1、创建&查看&删除&合并分支

git branch --- 查看本地分支,会列出所有分支,当前分支前面会标一个*号

git branch --remotes --- 查看远程分支,会列出所有分支

git branch 【分支名xxx】--- 创建xxx分支

git branch -d 【分支名xxx】 --- 删除xxx分支

Git友情提醒,xxx分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。

git checkout 【分支名】--- 切换到另一个分支

git checkout  -b【分支名】--- 创建+切换分支,-b参数表示创建并切换分支

git merge 【分支名xxx】--- 合并xxx分支到当前分支

2、合并冲突

情景:合并分支时,如果对相同文件做了修改可能会引起冲突,必须手动解决冲突后再提交。git status命令也可以告诉我们冲突的文件。

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改后保存文件再提交。

用带参数的git log也可以看到分支合并图,查看分支的合并情况:git log --graph --pretty=oneline --abbrev-commit

总结

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

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

用git log --graph命令可以看到分支合并图。

3、分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

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

例如:准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:git merge --no-ff -m "merge with no-ff" dev

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在

master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

总结:

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

4、存储工作区&Bug分支

情景:正在dev上进行的工作未做完无法提交,又需要修复编号101的bug任务时,或许需要创建一个分支bug-issue-101来修复它。

a、git status,查看分支状态;

b、git stash,Git提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作;

c、git checkout -b bug-issue-101,在当前分支创建+切换分支;

d、修复bug并commit提交;

e、修复完成后,切换到dev分支,并完成合并,最后删除bug-issue-101分支;

git checkout dev

git merge --no-ff -m "merged bug fix 101" bug-issue-101

git branch -d bug-issue-101

f、查看之前工作现场并恢复工作;

git stash list

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

另一种方式是用git stash pop,恢复的同时把stash内容也删了;

总结

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

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

5、多人协作,推送分支&抓取分支&Rebase

推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。git push origin 【分支名xxx】

但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?

    master分支是主分支,因此要时刻与远程同步;

    dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

    bug分支只用于在本地修复bug,就没必要推到远程了;

    feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

抓取分支

用git pull把最新的提交从origin/dev抓下来,然后在本地合并解决冲突

多人协作的工作模式通常是这样:

a、试图用git push origin 【分支名】推送自己的修改;

b、如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

c、如果合并有冲突,则解决冲突,并在本地提交;

d、没有冲突或者解决掉冲突后,再用git push origin 【分支名】推送!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch --set-upstream 【分支名xxx】 

origin/【分支名xxx】。

这就是多人协作的工作模式。

Rebase

rebase操作可以把本地未push的分叉提交历史整理成直线;

rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

总结

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

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

从本地推送分支,使用git push origin 【分支名xxx】,如果推送失败,先用git pull抓取远程的新提交;

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

建立本地分支和远程分支的关联,使用 git branch --set-upstream 【分支名xxx】 origin/【分支名xxx】;

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


七、标签管理

Git的标签也是版本库的快照,是指向某个commit的指针(但是分支可以移动,标签不能移动),创建和删除标签都是瞬间完成的。可以理解为

tag是某个commit id的别称,让人容易记住的有意义的名字,它跟某个commit id绑在一起。

ps:这里注意一点,没有不同分支下tag这个概念,也就是说tag不是属于某个分支的,而是全局的tag,是对于commit编号的一个别称。

用命令git tag --- 查看所有标签,注意,标签不是按时间顺序列出,而是按字母排序的。

可以用git show 【tagname】--- 查看标签信息

git tag 【tagname】【commit id】--- 新建一个标签,默认为HEAD,也可以指定一个commit id

git tag -a 【tagname】 -m "message" --- 可以指定标签信息

1、创建标签

a、首先,切换到需要打标签的分支上dev;

b、然后,敲命令git tag 【tagname】就可以打一个新标签,默认标签是打在最新提交的commit上;

c、如果要对之前commit id打标签,敲命令git tag 【tagname】【commit id】;

2、操作标签

git tag -d 【tagname】--- 删除标签

git push origin 【tagname】--- 推送某个标签到远程

git push origin --tags --- 一次性推送全部尚未推送到远程的本地标签

git push origin :refs/tags/【tagname】--- 删除一个远程标签

删除一个远程标签git push origin :【分支名】/【tagname】注意冒号 : 必不可少, 后面跟远程库的分支名/标签名

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:git tag -d v0.9

然后,从远程删除。删除命令也是push,但是格式如下:git push origin :refs/tags/v0.9



… create a new repository on the command line

echo "# ijkplayer_projiect" >> README.md

git init

git add README.md

git commit -m "first commit"

git remote add origin https://github.com/1218683832/ijkplayer_projiect.git

git push -u origin master

…push an existing repository from the command line

git remote add origin https://github.com/1218683832/ijkplayer_projiect.git

git push -u origin master

…import code from another repository

You can initialize this repository with code from a Subversion, Mercurial, or TFS project.

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 7,328评论 7 153
  • 安装Git Git的下载地址:Git官网下载地址 Git本地仓库和命令 配置用户 下载完Git后,右键会有一个Gi...
    TokyoZ阅读 1,222评论 1 5
  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 1,877评论 0 8
  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 2,000评论 3 25
  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 200评论 0 4