初识git--基础命令

重要:远程分支是一些无法移动的本地分支,本地分支,本地分支,三遍!是对远程库中分支的索引,只有在git进行网络交互时才会更新,用 (远程仓库名)/(分支名) 这样的形式表示远程分支

一、基础命令1

1 修改全局名称和邮箱,可用其他命令修改单独库

git config --global user.name "xxx"

git config --global user.email "xxx"

2 在需要成为仓库的目录下,初始化git文件仓库

git -init 

3 查看git仓库当前状态 有相关提示指令

git status

4 添加到暂存库,提交(并写有意义的提交提示)

git add fileName

git commit -m "xxx" 

5 查看当前状态后,若有修改,可查看指定文件发生了什么修改变化

注意:在文件未git add时,若对文件修改了多次,使用git diff 时,只会比较最后一次修改和最后提交部分的不同,中间修改不记录

git diff fileName   (默认把当前工作空间最新的和最新的版本库中内容进行比较)

其他形式:把当前工作空间(可以是暂存区)最新的和指定版本库中的内同进行比较

git diff sha1值或head^等  --  fileName   ,其中sha1值或head^等为指定的版本库

小结:

随时查看git状态,用git status,查看哪个文件本怎么修改 用git diff fileName

----------------------------------------------------------------------------------------------------

二、基础命令2

1 显示从最近到最远的提交情况。

git log(sha1/author/date/提示)

git log --pretty=oneline 一行信息展示(sha1/提示)

2 跳到之前某个已经提交的版本(上个/上上个/前100个)

git reset --hard HEAD/HEAD^/HEAD^^/HEAD~100

git reset --hard 版本号(可以写前面几个字母数字 git自动查找)  可以跳到任意一个指定版本号的版本,故可前进和回退到指定版本

注意:此时需要知道确定的版本号(sha1值)。

3 若已经关闭shell,无法知道某个版本sha1值,如何回退?   需要查看commit和reset的相关操作 ,找到某个版本号

git reflog 

小结:

'在git 中各个版本之间来回,改变的知识head指针指向的某个版本,速度极快。

HEAD表示当前版本 , HEAD^表示上一个, HEAD^^上上一个,HEAD~100上100个版本

跳到指定版本命令:git reset --hard commit_id

回退前需要查看历史提交记录(从最近到最远)git log  /git log --pretty=oneline

回到未来,需要查看命令历史 git reflog

----------------------------------------------------------------------------------------------------

三、基础命令3

1 对工作区(非暂存区)修改的文件进行撤销 (注意和git reset --hard head^/sha1有区别 这个是直接回退到某个commit版本)

   此处 --不能丢失,否则为切换分支命令, 这里撤销有两种情况:1)暂存区中没有,撤销后回到最新的commit版,2)

暂存区中有,则撤销后回到暂存区中的版本

git checkout --  fileName  

2  暂存区的修改回退到工作区  

git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

git  reset head fileName 

注意:若把文件改好了,从暂存区提交,此时想更改,可以通过git reset --hard head^回退到上个版本。

但是若已经上传到了远程,那就完蛋了。

小结:

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考git reset --hard submit_id,不过前提是没有推送到远程库。

----------------------------------------------------------------------------------------------------

四、基础命令4

说在前:

    版本库1----->已修改未进暂存区----->已进入暂存区----->已修改未进暂存区

    git reset --hard commit_id 回退到不同版本  也可git reset head fileName 从暂存区中撤销,回到工作区

    git add fileName进去添加暂存区   git rm fileName进入删除暂存区

    git checkout-- fileName 其实是用版本库或暂存区里的版本替换工作区的版本。添加时用此命令表示退回到最近的暂存区或版本库,误删除时用此命令,表示还原文件退到删除之前的  最近的暂存区或者版本库中。

1 删除与误删, 删除情况rm和add增加的情况类似,删除也有一个删除暂存区

 在文件夹中删除一个文件之后有2中情况:

 1)确实要删除,rm fileName,git rm fileName  进入删除暂存区; git commit -m "delete fileName"  即可彻底从git中删除,无法恢复

 2)已经在文件夹中误删,但git中未删, git checkout-- fileName 后有4种情况(根据文件的修改情况如上图分类):会进入最近的版本库或者暂存区,未在版本库或暂存区中的修改会丢失

注意:不能对进入删除暂存区(git rm fileName)中的文件直接使用git checkout-- fileName进行恢复,必须先从删除暂存区中退回到删除工作区git reset head fileName,后再git checkout-- fileName进行恢复

  一句话,只要没有从git中彻底git rm,git commit删除,都可以进行恢复操作,恢复到文件之前的版本

---

不删除文件夹中文件,只是删除git中,git rm --cached fineName

 ----------------------------------------------------------------------------------------------------

五、基础命令5

 1 在本地git仓库文件夹下,添加远程库:

    git remote add origin git@github.com:feiwang1991/learnGit.git

    此命令后,origin是git的默认远程仓库名称,

 2  第一次推送到远程仓库,-u参数 不但会把本地的master分支推送到远程新的master分支,还会把本地master和远程master分支关联起来

   git push -u origin master

   此时,只要本地做了修改提交后,即可使用git push origin master,推送到远程

小结:

  要关联一个远程库,使用命令:git remote add origin git@服务器地址:path/repo-name.git

  关联后,使用 git push -u origin master 第一次推送master分支的所有内容

  在每一次本地提交后,可git push origin master 只要有必要,就可推送修改。 

  git可以不需要联网时,在本地提交,但是svn需要联网才能提交,只能通过网络提交,git可以有网络时再一次性提交

----------------------------------------------------------------------------------------------------

六、基础命令6

   通常最好的方式是先在远程建立一个远程库,然后克隆到本地

  1 从远程仓库克隆一个仓库到本地

   git clone git@github.com:feiwang1991/gitSkills.git

小结:

  克隆的时候使用git clone命令

  git支持多种协议,其中git方式默认支持ssh协议,速度最快,当然也可以使用https协议,这个每次需要输入口令,速度较慢。

----------------------------------------------------------------------------------------------------

七、基础命令7

 1 创建分支

   git branch xxx

 2 切换分支

   git checkout xxx

 3 创建并切换分支,相当于1和2的两个效果。

   git checkout -b xxx

 4 查看当前分支

   git branch

 5 合并指定分支到当前分支

  git merge xxxbranch

 6 删除分支 

   git branch -d xxx

小结:

   Git鼓励大量使用分支,速度极快,且安全

   查看分支:git branch

   创建分支:git branch <name>

   切换分支:git checkout <name>

   创建并直接切换到分支:git checkout -b <name>

   合并某个分支到当前分支:git merge <name>

   删除某个分支:git branch -d <name>

 ----------------------------------------------------------------------------------------------------

八、基础命令8

在当前分支中合并某个分支用git merge xxx ,分支合并有fast-forward ,这种不需要解决冲突。 另一种是会产生冲突,此时需要在冲突文件中,手动解决冲突,然后git add,git commit即可

 注意:冲突解决后,其他分支仍在原始位置,并没有跟进,需要删除分支

 1 查看分支合并情况图

  git log --graph --pretty=oneline --abbrev-commit

 ----------------------------------------------------------------------------------------------------

九、基础命令9

合并分支时,如果可以git会使用fast-forward方式,如果删除分支后,会丢失分支信息,

若要强制禁止使用此中方式,可以git merge --no-ff -m <name>方式,git在merge时会产生一个新的commit,这样从历史上就可以看出分支信息。

1 禁止使用fast-forward方式

 git merge --no-ff -m "" <name>

分支策略:

git开发时,应该注意几个原则。master分支时最稳定的分支,一般不在上面开发,master分支用于发布新的稳定版本。

dev分支用于开发任务,每个小伙伴从dev中弄一个自己的分支,ok了就往dev上合并就可以了

----------------------------------------------------------------------------------------------------

十、基础命令10

 BUG分支:当出现bug时,如紧急接到issue-101BUG,我们此时在dev分支上进行新功能开发,且暂时有许多在暂存区和工作区的文件未提交,暂时无法写完,怎么办?

 需要对当前dev环境进行存档,以一个十分干净的环境修改bug,这很重要(用之前稳定的版本修改bug),若在master上修改bug,则从master出分支,完成后合并bug,之后切换并还原dev现场存档,继续开发等工作。

 1 将工作线程存储起来

   git stash

  2 查看当前分支中所有存档的现场

  git stash list

  3 恢复现场

   git stash apply

  4 恢复后删除现场

  git stash drop

  5 恢复并删除现场存档,等于3和4两步操作

  git stash pop

  6 可以多次stash,恢复时候可以恢复指定stash (查看用git stash list)

   git stash apply <stash@{0}>

小结:

  当有bug时,我们通过创建bug分支修复bug,然后修复bug,然后合并

  当手头工作没完成时,我们把现场保存一下git stash,然后去修复bug,完成后恢复现场继续工作

----------------------------------------------------------------------------------------------------

十一、基础命令11

 1 如果要丢掉一个没有合并过的分支,如用来开发新功能的feature分支,每次开发新功能需要创建一个feather分支,即不能正常删除,会提示丢失数据

  可以强行删除  git branch -D <name>

十二、基础命令12

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

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

  • bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

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

 1 从远程仓库克隆到本地,git会直接关联本地master分支和远程master分支,且将远程名称默认为origin

   git clone git@github.com:feiwang1991/learnGit.git

 2 在本地git仓库文件夹下,添加远程库:

    git remote add origin git@github.com:feiwang1991/learnGit.git

    此命令后,origin是git的默认远程仓库名称,

 3 第一次推送到远程仓库,-u参数 不但会把本地的master分支推送到远程新的master分支,还会把本地master和远程master分支关联起来

   git push -u origin master,此处的origin是远程库名称,master是本地分支的名称 

   git push origin master  意思为将本地master分支内同推送到远程Origin中对应的分支中去

十三、基础命令13 关于pull push merge rebase fetch区别

1 git clone url 之后默认远程仓库名字 origin

2 git remote -v 查看远程仓库名称 url

3 git remote add name url 添加远程仓库

4 git fetch remote-name 抓取远程仓库的所有本地没有的信息,可抓取所有分支,之后可以对其合并或者查看

如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以,git fetch origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

如果设置了某个分支用于跟踪某个远端仓库的分支(参见下节及第三章的内容),可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。

5 git push remote-name local-branch-name

 项目进行到一个阶段,要同别人分享目前的成果,可以将本地仓库中的数据推送到远程仓库。实现这个任务的命令很简单: git push [remote-name] [branch-name]。如果要把本地的 master 分支推送到origin 服务器上(再次说明下,克隆操作会自动使用默认的 master 和 origin 名字).如果在你推数据前,已经有其他人推送了若干更新,那 你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。

6 git remote show remote-name 查看某个远程仓库的详细信息 如push pull分支信息

它告诉我们,运行 git push 时缺省推送的分支是什么(译注:最后两行)。它还显示了有哪些远端分支还没有同步到本地(译注:第六行的caching 分支),哪些已同步到本地的远端分支在远端服务器上已被删除(译注:Stale tracking branches 下面的两个分支),以及运行git pull 时将自动合并哪些分支(译注:前四行中列出的 issues 和 master 分支)。

8 git remote rename old-name new-name 给远程仓库重名了

  git remote rm remote-name 移除远程仓库

9 git branch -v 查看每个分支最后提交的情况

  git branch --merged/ --no-merged看哪些分支已经被/没有并入到当前分支

10 重要:假设你们团队有个地址为 git.ourcompany.com 的 Git 服务器。如果你从这里克隆,Git 会自动为你将此远程仓库命名为origin,并下载其中所有的数据,建立一个指向它的 master 分支的指针,在本地命名为origin/master,但你无法在本地更改其数据。接着,Git 建立一个属于你自己的本地master 分支,始于 origin 上 master分支相同的位置,你可以就此开始工作

一次 Git 克隆会建立你自己的本地分支 master 和远程分支 origin/master,它们都指向 origin/master 分支的最后一次提交。

http://blog.jobbole.com/25877/

如果你在本地 master 分支做了些改动,与此同时,其他人向 git.ourcompany.com 推送了他们的更新,那么服务器上的master 分支就会向前推进,而于此同时,你在本地的提交历史正朝向不同方向发展。不过只要你不和服务器通讯,你的 origin/master 指针仍然保持原位不会移动(见图 3-23)。

图 3-23. 在本地工作的同时有人向远程仓库推送内容会让提交历史开始分流。

可以运行 git fetch origin 来同步远程服务器上的数据到本地。该命令首先找到 origin 是哪个服务器(本例为git.ourcompany.com),从上面获取你尚未拥有的数据,更新你本地的数据库,然后把 origin/master 的指针移到它最新的位置上(见图 3-24)。

图 3-24. git fetch 命令会更新 remote 索引。

11 推送本地分支 重要

如果你有个叫 serverfix 的分支需要和他人一起开发,可以运行 git push (远程仓库名) (本地分支名): git push origin serverfix

==git push origin serverfix:serverfix

这其实有点像条捷径。Git 自动把 serverfix 分支名扩展为 refs/heads/serverfix:refs/heads/serverfix,意为“取出我在本地的 serverfix 分支,推送到远程仓库的 serverfix 分支中去”。不过一般使用的时候都可以省略它。也可以运行 git push origin serverfix:serferfix 来实现相同的效果,它的意思是“上传我本地的 serverfix 分支到远程仓库中去,仍旧称它为 serverfix 分支”。通过此语法,你可以把本地分支推送到某个命名不同的远程分支:若想把远程分支叫作awesomebranch,可以用 git push origin serverfix:awesomebranch 来推送数据。接下来,当你的协作者再次从服务器上获取数据时,他们将得到一个新的远程分支 origin/serverfix:

git fetch origin

值得注意的是,在 fetch 操作下载好新的远程分支之后,你仍然无法在本地编辑该远程仓库中的分支。换句话说,在本例中,你不会有一个新的serverfix 分支,有的只是一个你无法移动的 origin/serverfix 指针。如果要把该内容合并到当前分支,可以运行 git merge origin/serverfix。如果想要一份自己的 serverfix 来开发,可以在远程分支的基础上分化出一个新的分支来:

git checkout -b serverfix origin/serverfix这会切换到新建的 serverfix 本地分支,其内容同远程分支 origin/serverfix 一致,这样你就可以在里面继续开发了。我们克隆时候,不需要自己新建本地master分支,会自动创建

12 跟踪远程分支 重要

从远程分支 checkout 出来的本地分支,称为_跟踪分支(tracking branch)_。跟踪分支是一种和远程分支有直接联系的本地分支。在跟踪分支里输入git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。反过来,在这些分支里运行 git pull 会获取所有远程索引,并把它们的数据都合并到本地分支中来。

在克隆仓库时,Git 通常会自动创建一个名为 master 的分支来跟踪 origin/master。这正是git push 和 git pull 一开始就能正常工作的原因。当然,你可以随心所欲地设定为其它跟踪分支,比如origin 上除了 master 之外的其它分支。刚才我们已经看到了这样的一个例子:git checkout -b [分支名] [远程名]/[分支名]。如果你有 1.6.2 以上版本的 Git,还可以用–track 选项简化:

git checkout --track origin/servfix

要为本地分支设定不同于远程分支的名字,只需在前个版本的命令里换个名字

git checkout -b sf  origin/serverfix 现在你的本地分支 sf 会自动向 origin/serverfix 推送和抓取数据了。

13 删除远程分支

如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放稳定代码的地方),可以用这个非常无厘头的语法来删除它:git push [远程名] :[分支名]。如果想在服务器上删除serverfix 分支,运行下面的命令:git push origin :serverfix

咚!服务器上的分支没了。你最好特别留心这一页,因为你一定会用到那个命令,而且你很可能会忘掉它的语法。有种方便记忆这条命令的方法:记住我们不久前见过的 git push [远程名] [本地分支]:[远程分支] 语法,如果省略 [本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]”。

14分支的合并 重要

http://blog.jobbole.com/25877/ 参考其合并操作

切换到次分支中,在次分支中git rebase master(主要分支),就可以把次分支做成补丁在朱分支中重做,此时产生一个新的提交成为主分支的直接下游,当前次分支指针指向这个新的提交,此时主分支还在原始位置。只需对主干进行一次快进合并即可

git merge 次分支,是在主分支中进行的,把次分支合并进当前主分支,git rebase 主分支,是在次分支中进行的,合并入主分支,次分支指针前进

虽然最后整合得到的结果没有任何区别,但衍合能产生一个更为整洁的提交历史。请注意,合并结果中最后一次提交所指向的快照,无论是通过衍合,还是三方合并,都会得到相同的快照内容,只不过提交历史不同罢了。衍合是按照每行的修改次序重演一遍修改,而合并是把最终结果合在一起。

git rebase --onto master server client 把client上的东西跳过server在master上重做一遍

重要:”我们可以直接把 特性分支衍合到主分支,而不用手工切换到 特性分支后再执行衍合操作 — git rebase [主分支] [特性分支] 命令会先取出特性分支server,然后在主分支 上重演:

之后再在切换到主分支上进行git merge 特性分支 快速前进即可

如果把衍合当成一种在推送之前清理提交历史的手段,而且仅仅衍合那些尚未公开的提交对象,就没问题。如果衍合那些已经公开的提交对象,并且已经有人基于这些提交对象开展了后续开发工作的话,就会出现叫人沮丧的麻烦。

小结:

关于重要的几个概念:

1 git中会把远程仓库中的分支通过git fetch remote-name 拉所有分支到本地 ,这就是远程分支 remote-name/branch-name表示。远程分支只用来拉数据(不能直接更改数据),和本地的分支是两回事,本地分支可通过git checkout -b 本地分支名 remote-name/remote-branch 的方式(或git checkout --track 远程名/分支名)产生一个和远程分支同起点的跟踪分支,clone的话,git可以直接产生origin/master的远程分支和master的本地跟踪分支,在跟踪分支可直接git push ,git pull

2 远程分支是不能更改数据的,只可以从远程git fetch name,可以通过远程分支对应的跟踪分支进行push数据即可

3 git rebase 只能必须只合并没有共享过的内容,不然会丢失内容,造成混乱

4 跟踪分支有个方便之处就是可以直接使用git pull  git push, 也可不需要,我们写满 git push remote-name branch-name、git pull remote-name branch-name也可以

十四、基础命令14

  标签就是给对应的commit版本一个好记住的名字,而已。

  1 打标签,切换到需要打的分支上,若直接打标签 git tag <name>

     git tag v1.0 就是在最新的提交上打标签

  2 查看已经打的标签

     git tag

  3 若想在之前提交的版本上打tag,可以先查看之前commit的版本号码,根据git tag <name> <commit_id>

   git tag v0.3 3ffr4  

  4 查看某个标签对应版本的具体信息

    git show tag-name

  5 可以打具有说明的标签 -a是标签名  -m是说明

   git tag -a  <name> -m "xxx" commit_id

  6 删除标签 

    git tag -d <name>

  7 推送某个标签到远程

   git push origin <tag-name>

  8 一次性推送所有尚未推送到远程的标签到远程

  git push origin --tags

  9 删除标签 ,要先从本地开始删除 git tag -d name, 再从远程删除

   git push origin :refs/tags/v0.1

 小结:

 

  • 命令git push origin <tagname>可以推送一个本地标签;

  • 命令git push origin --tags可以推送全部未推送过的本地标签;

  • 命令git tag -d <tagname>可以删除一个本地标签;

  • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

 

   十五、基础命令15

    1 .gitignore文件 ,直接放在工作目录下  且为了起作用必须提交到git

     里面直接写 *.txt 等或者 a.b就可以

    2 可以使用别名替代常命令

     git config --global alias.st status

     git config --global alias.ci commit

     git config --global alias.br branch

     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"

 

  

转载于:https://www.cnblogs.com/wangfeigg/p/6264400.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值