git/github操作手册

作者: icessun | 来源:发表于2017-07-07 11:12 被阅读77次
工作流图

认识Git

  • 分布式:可以协作,任务可以拆分;每次的改动都有记录,版本可以控制
  • 强大的分支管理

直接记录快照,而非差异比较

关心文件数据的整体是否发生变化,而非文件内容的具体差异;每一次提交更新,会对所有的文件作一快照,保存一个指向快照的索引,要是文件没有变化,不会再次保存,只是对上次保存的快照作一链接。也就是说每一个版本都独立保存。

更新的文件快照

几乎都是在本地操作

Git在本地磁盘上就保存着所有当前项目的历史更新,所有保存在 Git 数据库中的东西都是用哈希值(SHA-1 校验和)来作索引的,而不是靠文件名。

Git安装

  • 直接下载msysgit软件,默认安装。
  • 开始菜单里面找到Git---->Git Bash,或者新建一个文件夹,然后在上面鼠标右键,选择Git Bash,出现类似于命令行窗口,输入git --version,出现版本号,说明安装成功。
    Git安装

Git 配置

配置这步很关键,主要是为了以后上传代码到服务器上面的一个身份认证。确认之后不能更改。

//在cmd命令行里面输入下面两句,进行配置,不能有中文
       $ git config --global user.name "Your Name"
       $ git config --global user.email "email@example.com"     
// 查看git配置信息,可以查看到刚才注册的邮箱和用户名
        $ git config --list
// 配置差异分析工具
    $ git config --global merge.tool vimdiff
// 获取帮助
     $ git help <verb>
配置Git

git的三种状态

git是维护这三种状态来实现版本控制的。

  • 工作区域
    在本地存放项目的文件夹,一般里面会包含一个.git文件夹,在里面对项目进行修改。
  • 暂存区stage
    保存修改好的代码快照,准备提交到Git仓库的一个列表信息,类似于一个中间桥梁,架设在git仓库和工作区域之间。
  • Git仓库
    存放源代码的索引,其实就是工作区域中的.git文件夹,HEAD指针指向的最新版本的数据
git三种状态
  • Git管理的文件三种状态
    • 已修改(modified)
    • 已暂存(staged)
    • 已提交(committed)
  • Git的工作流程:
    • 在工作目录里面添加和修改文件
    • 将需要进行版本管理的文件放入暂存区域stage
    • 将暂存区域的文件提交到git仓库

实战操作


红色表示:在工作区修改了但是没有提交到暂存区。绿色表示:在暂存区但是没有提交到git版本库中。

  • 在桌面新建一个文件夹,取名为test,新建的文件夹Test就是工作区域(工作目录)。
  • 在Test文件夹上面,右键,选择Git Bash或者直接使用cmd的命令行,使用cd test文件夹目录命令,切换到test文件夹里面
  • 在打开的命令行里面输入git init,这样就初始化了一个git仓库
    成功初始化git仓库
    细心就会发现,这个仓库的位置是位于.git 文件夹下面的,是的,刚才的动作是初始化了一个git仓库,而git仓库就是.git文件夹,并且会会自动创建的第一个分支master,以及指向这个分支的指针HEAD
    当前分支的名称

如果看不到.git 文件夹,那么需要把电脑设置的隐藏文件夹的选项勾选去掉。

文件夹----> 选择组织选项----->文件夹和搜索选项---->查看(win8以上直接从这步开始)---->隐藏文件和文件夹设置状态为显示
. git文件夹内容
里面的HEAD文件保存着版本的索引,且HEAD指针指向的是最新版本,版本的切换和回滚就是靠它。.git文件夹里面保存的都是git跟踪项目迭代需要的数据。文件夹里面的内容不要去修改,都是自动生成的。
  • 接下来就应该是打开项目,进行项目的修改和编写。在Test文件夹里面新增加文件readme.md
  • 修改完代码,测试没有问题,那么就需要把改动的文件夹或者是新增加的文件提供给git 跟踪,提交到暂存区(staged):git add 指定的文件名或者使用命令git add *来提交所有的文件。
    添加git管理
    图解git add

可以使用命令 git status来查看当前工作区域文件的状态,时刻了解当前仓库的状态:

文件状态查看
上图说明,当前工作区域没有文件需要进行提交(1),可以使用命令git rm --cached <file>把文件从跟踪清单stage里面删除(2),下面的青色字,表示有一个新文件被加到暂存区了(3)。
  • 文件被管理后,需要把修改好的文件,放到git仓库里面,这样就算是一个版本,使用命令git commit -m '对程序修改的描述'
    commit提交到git仓库
    上图是提交到git仓库的步骤,会给用户一些反馈;主分支提交,后面的7位hash值,就是HEAD跟踪的版本(1),100表示该文件是一个普通文件,644表示的是文件的读写权限linux中(2)。
    git commit 图解

这个时候,我们再次查看工作区域的文件状态:该工作树是干净的,不需要提交。

工作区域的文件状态
到目前为止,实现了一个文件被git管理,并且提交到git仓库的过程,总结:一个项目修改到提交,两步骤:
  • git add *
  • git commit -m '版本描述'

合并一步:

  • git commit -am '版本描述'

反悔操作


什么时候会出现修改撤销呢?我们在工作区修改文件错误;或者已经add提交了,把错误也提交了暂存区;再或者commit把错误提交到了版本库中

在工作区反悔,没有add之前

  • 发现错误及时,可以直接手动把错误文件删除
  • 错误太多,也可以使用命令git checkout -- <file>,利用暂存区的文件(上一次提交的内容),覆盖掉工作区中的文件
    友好的操作提示
    我修改了Test文件夹中的文件,发现修改出现了错误,就如图片中提示的那样,使用命令git checkout -- readme.md,获取暂存区的文件来覆盖掉工作目录中的修改。

add之后,commit之前

  • 取消已经放入暂存区的文件,回到已经修改但未暂存的状态
  • 使用这个命令git reset HEAD <file>,可以指定某一个文件撤销,也可以全部提交到暂存区的文件撤销,回到未暂存的状态
  • 退回到工作区,可以使用git status,来查看状态是否恢复到未暂存的状态,还可以使用git checkout -- <file>来撤销工作区的修改
    后悔: add之后,commit之前

commit之后,提交到了版本库,没有推送到远程

  • 这个时候,我们只能回退版本了,前提是你没有把版本库提交到远程,否则是修改不了了
    三种状态的关系

文件保存在仓库

$ git add <file>  // 把文件添加到仓库 暂存区
$ git commit -m '描述'  // 文件提交到仓库 保存一个版本的快照 保存在版本历史记录里面

$ git commit -a -m '描述' // 直接跳过暂存区,把所有已经跟踪过的文件暂存起来一起提交

// 漏掉的文件没有加入,或者提交的消息写错了 修改最后一次提交 如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。
$ git commit --amend 


$ git rm 要删除的文件 // 该文件就不会纳入版本管理,要是这个删除文件,已经修改并且放到了暂存区的话,就必须强制删除 -f

$ git rm --cached 不跟踪的文件 // 把文件从跟踪清单里面删除

// 重新命名文件
$ git mv file_from  file_to
  • 可以使用$ git diff来查看具体修改了什么地方,是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容,若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用git diff --cached 命令。更高版本还允许使用git diff --staged,效果是相同的,但更好记些。
  • 要把修改后的文件,提交到仓库,继续上面的两个命令add 和 commit

版本回退

  • commit命令是在仓库里面保存我们一个版本的快照,所有后面跟的说明文件很重要,我们可以使用$ git log来查看我们保存的版本历史记录,通过描述文件更快的知道,然后通过历史记录回退到以前的版本
  $ git log // 从最近的到最远的版本记录
   
  $ git log -p -2 // -p 展示每次提交的内容差异 -2 最近两条 
  
  $ git log --pretty=oneline  --graph // 输出的信息更简短   --graph  多出一些 ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况。
  • 此时我们可以从输出的信息看到commit id ,是一连串的由sha1计算出来并且以16进制表示的数字,这个数字是我们回退到以前版本的版本号
  • git中,使用HEAD表示当前版本,也就是上面输出信息的第一个,上一个版本就是HEAD^,上上个版本就是HEAD^^,以此类推,n个前的版本就是HEAD~n
  • 回退到上一个版本,使用下面命令,然后输出HEAD is now at commit id号 说明信息,查看仓库的文件,已经恢复到上一个版本了
$ git reset --hard HEAD^
  • 此时在次输入$ git log,我们会发现,前一个版本不见了,只有我们现在的版本和现在版本之前的版本,要是我们还是需要回到前一个版本呢,这个时候commit id就发挥作用了,在当前的窗口向上查找前一个版本的commit id号,然后输入$ git reset --hard commit id号,不需要输入完整的
  • 当我们不小心关闭了窗口,找不到了前一个版本的id的时候,我们可以使用$ git reflog来查找,查看命令历史
  • 如果不add到暂存区,那就不会加入到commit

远程仓库github

  • 访问github官网注册帐号,参考资料
  • 由于本地仓库和远程仓库是靠ssh加密传输的,所以首先要创建SSH KEY,打开用户主目录,一般是这样的地址C:\Documents and Settings\Administrator,查看是否有一个.ssh的文件,可能文件夹被隐藏,应该在文件夹选项里面设置显示隐藏文件,有的话,直接打开,复制id_rsa.pub(公钥)里面的内容,登入github网站,打开account settings,选择SSH KEYS页面,然后点击Add SSH KEY,把复制的内容粘贴到里面就行
  • 要是主目录下面没有,打开git命令窗口,创建SSK KEY;$ ssh-keygen -t rsa -C "youremail@example.com"
  • 然后在远程仓库里面创建一个仓库,在本地仓库里面使用下面命令和远程仓库建立链接:$ git remote add origin git@github.com:icessun/icessun.github.io.git // 添加远程仓库,远程库的名字默认origin
  • 推送本地仓库的文件到远程库中
  $ git push origin master / 远程仓库的名字  分支的名字
  $ git remote show 远程仓库的名字 // 查看远程仓库的信息
  $ git remote rename 原远程仓库的名字  现在仓库的名字 // 修改某个远程仓库在本地的简称
  $ git remote rm 远程仓库的名字  // 碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库,
  • 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。以后每次提交只需要$ git push origin master

  • 查看当前配置了那些远程仓库

  $ git remote // 查看配置了那些远程仓库

  $ git remote -v // 显示对应的克隆地址  

  // 如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。 
  $ git fetch origin  // 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)

  $ git fetch 远程仓库名 // 拉取本地仓库没有的信息 从远程仓库抓取数据到本地 并不自动合并到当前工作分支
  
  • 克隆远程仓库$ git clone git@github.com:icessun/icessun.github.io.git

git clone 命令本质上就是自动创建了本地的 master分支用于跟踪远程仓库中的 master 分支;运行 git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。

分支管理

使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作;切换分支之前要保存当前分支的工作区是干净的,把修改提交,否则不让你切换分支

  • 创建分支:$ git branch 分支的名字
  • 切换分支:$ git checkout 分支的名字
// 上面两个命令合并成为一条
 $ git checkout -b 分支的名字

 $ git branch -v // 查看各个分支最后一个提交对象的信息
 
 $ git branch --merged // 查看哪些分支已被并入当前分支,也就是说哪些分支是当前分支的直接上游。

  $ git branch --no-merged // 查看尚未合并的工作
创建分支testing

HEAD指向当前工作的分支,也可以说是当前分支的别名,HEAD会随着当前工作分支的变化而变化,每提交一次,HEAD向前走动一次

切换到新建的分支上面

在当前新建的分支上面提交后,会向前移动了一格,而master分支仍然指向原先 git checkout时所在的 commit 对象。

在新建的分支上面提交 切换到主分支上面

在当前分支上面再次提交,项目提交历史产生了分叉;因为刚才我们创建了一个分支,转换到其中进行了一些工作,然后又回到原来的主分支进行了另外一些工作。这些改变分别孤立在不同的分支里:我们可以在不同分支里反复切换,并在时机成熟时把它们合并到一起。

项目提交历史出现分叉
  • 查看当前的分支:$ git branch,当前的分支会出现一个*
  • 把当前分支合并到主分支上面:$ git merge 要合并的分支,合并到master分支上面,合并分支前要切换到要合并的分支上面

由于当前 master 分支所指向的提交对象(C4)并不是 iss53分支的直接祖先,Git 不得不进行一些额外处理。就此例而言,Git 会用两个分支的末端(C4 和 C5)以及它们的共同祖先(C2)进行一次简单的三方合并计算。用红框标出了Git用于合并的三个提交对象:

分支的合并 合并后

合并出现冲突

  • 如果在不同的分支中都修改了同一个文件的同一部分,Git 就无法干净地把两者合到一起(译注:逻辑上说,这种问题只能由人来裁决。)
    • 要看看哪些文件在合并时发生冲突,可以用 git status 查阅
 <<<<<<< HEAD
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
  please contact us at support@github.com
</div>
>>>>>>> iss53

可以看到=======隔开的上半部分,是 HEAD(即 master分支,在运行merge 命令时所切换到的分支)中的内容,下半部分是在 iss53分支中的内容。

  • 删除分支:$ git branch -d 要删除的分支的名字
  • 分支合并出现冲突:$ git log --graph --pretty=oneline --abbrev-commit查看分支合并的情况,出现冲突的时候,我们应该手动修改冲突,在提交
  • 合并禁止Fast forward(当前要合并的分支[新]是master分支[老]的直接上游)模式:$ git merge --no-ff -m '描述' 要合并的分支;这样可以保存合并的分支
  • Bug分支:把当前的工作现场隐藏起来:$ git stash;接着和创建分支一样,创建一个临时的bug分支,修改完成之后合并bug分支到master主分支上面,$ git stash list;查看当前的工作区的隐藏列表,恢复工作区:$ git stash pop,继续工作区的任务
  • 每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支;如果要丢弃一个没有被合并过的分支,可以通过git branch -d <分支name>强行删除

多人协作

  • 在本地克隆远程仓库的时候,自动把本地的master分支和远程的master分支对应起来
  • 查看远程仓库的信息$ git remove -v:就会显示抓取(fetch)和推送(push)的origin(远程仓库默认的名字)地址,没有推送权限是看不到(push)地址
  • 推送分支(把该分支上的所有本地提交推送到远程仓库):$ git push origin 本地分支的名字
  • 当你小伙伴把修改的推送到了远程,而你正好也修改了相同的文件,那么你就必须git pull下来最新的添加,在本地解决冲突合并,在推送到远程,如果pull 下来提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream 本地分支的名字 远程仓库分支的名字。
  • 在本地创建和远程分支对应的分支,使用 git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

小窍门

在 Windows 上安装了msysGit,默认使用的Git Bash就已经配好了这个自动补全脚本,可以直接使用。

在输入Git命令的时候可以敲两次跳格键(Tab),就会看到列出所有匹配的可用命令建议:

$ git co<tab><tab>
commit   config

  • GIT命名别名
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.last 'log -1 HEAD' // 要看最后一次的提交信息 git last

现在,如果要输入 git commit只需键入 git ci 即可

参考资料廖雪峰网站git教程
git pro

相关文章

  • git/github操作手册

    认识Git 分布式:可以协作,任务可以拆分;每次的改动都有记录,版本可以控制 强大的分支管理 直接记录快照,而非差...

  • Git的常用命令

    一、Git简易操作 git操作手册(命令行git bash) 最简单易懂的git操作廖雪峰git教程Pro Git...

  • Git 与 GitHub 入门操作手册

    不要一开始就试图理解 git 的原理,我目前也不理解,当下只需要背下这些命令,按步骤配置好 git 和 GitHu...

  • GitHub超简单小白入门详细教程(1)——了解Git与Gith

    了解Git与Github 和 使用GitHub的目的 一、了解Git与Github 1.1 什么是Git Git是...

  • git和github入门指南(1)

    1.git和github简介 #1.1.git是什么?github是什么?git和github的关系? Git是一...

  • git设置代理

    git的协议 git clone git@github.com[mailto:git@github.com]:ow...

  • git

    git和GitHub托管工具使用 通过git上传文件到GitHub上:git与GitHub 如何将GitHub上的...

  • Git在项目中的简单使用

    Git不是github! Git不是github! Git不是github! 重要的事情说三遍。 然后,githu...

  • Linux(centos7) git安装

    先到github上下载git的tar包 https://github.com/git/git/releases ...

  • Gitlab

    Git主页:https://git-scm.com/GitHub主页:https://github.com/Git...

网友评论

    本文标题:git/github操作手册

    本文链接:https://www.haomeiwen.com/subject/ezelhxtx.html