欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

宁皓网 Git:版本控制 有大用 有大大用 有大大大用

shiping1 的头像

得到帮助 - git help
使用 git help 可以得到很多有用的帮助信息。输入 git ,或者 git help ... 回车 ... 会显示出比较常用的 git 命令。还有一个简短的解释。

在 git help 后面加上一个 -a 参数,可以显示出所有的命令 ...

git help -a

使用一个 -g 参数,可以查看 git 的使用手册。

git help -g

我们也可以在 git help 加上具体的命令的名称,或者手册的名称,去查看更详细的内容。比如看一下 add 这个命令的使用说明... git help 后面加上命令的名称 add ...

git help add

会给我们显示出这个命令所有可用的选项,详细的描述,应用的示例等等 .. 使用 F 键( forward ),可以向下翻页 ...

用 B 键 ( back )可以向上翻页 ... 然后用 Q 键 (quit),可以退出显示帮助信息。

来自 https://ninghao.net/video/1883


命令帮助

a) git help -a#在 git help 后面加上一个 -a 参数,可以显示出所有的命令 ...


b) git help -g#使用一个 -g 参数,可以查看 git 的使用手册。


c) git help add#add是子命令的名称,,,,,使用 F 键( forward ),可以向下翻页 .......用 B 键 ( back )可以向上翻页 ... 然后用 Q 键 (quit),可以退出显示帮助信息。


配置

a) git config --global user.name '王皓'#全局配置用户名

b) git config --global user.email '王皓'     #全局配置邮箱

c) git config --unset --global user.name     #撤销全局配置的用户名

d) git config --global color.ui true         #全局配置带点颜色

e) git config --list#查看配置信息,,,我们在全局范围里做的这些配置,会保存在一个叫 .gitconfig 的文件里面。这个文件会放在当前用户的主目录下面 ..

f) git config --global alias.co checkout                                                #把checkout 的别名设为  co

g)  git config --global core.excludesfile ~/.gitignore_global                    #配置忽略文件 在  .gitignore_global  里面设置 ,  不是   .gitignore_global 这个文件啊

 #某个文件夹,就是工作区(工作目录)

    a) 文件夹里面 #git init                 #git 后面跟子命令

提交文件 

      # git status       #查看状态

    b) 文件夹里面 建一个文件 index.html             

    c) # git add .           ( git add index.html )                         # 点 .  表示所有修改的文件       到暂存区

     # git status

   d)  # git  commit -m '提交文件'    #提交一下        到当前分支(repository)

      # git status

   e)  # git  log                     #查看以往的提交

修改一个文件 index.html      

f) # git add .     #    到暂存区

再修改一个文件 index.html      

g) # git diff     #查看区别 diff  就是 different difference 的意思吧 暂存区与工作区的区别

h)  # git diff   --staged   #  当前分支(repository)与暂存区的区别

i)    # git commit -m "修改了 index.html的值为 zh-hans"

  # git status

j) # git add .     #    到暂存区

k) # git commit -m '为 index.html 添加了 viewport meta标签'     #    当前分支(repository)

l) # git log      #      查看以往的提交

  # git status

重命名文件进行提交

新建一个文件 style.css

a) # git status            #提示有个未跟踪的文件

b) # git add .           #    到暂存区

c) # git commit -m '添加 style.css 样式表'

  # git status         

重命名style.css 为 theme.css

  # git status   #显示删除了style.css ,有个未跟踪的文件theme.css


d) git rm style.css        #告诉git删除了style.css  其实是到暂存区


e) git add theme.css   # 告诉git添加了theme.css 其实是到暂存区     

  git status           #提示了重命名  

g) git commit -m '把style.css重命名为theme.css'

h) git status     

i)  git restore .        #把工作区,恢复成与仓库一样,与暂存区一样

重命名文件进行提交2    

a) git mv theme.css ninghao-theme.css    #此时到暂存区 

b) git status            #提示theme.css重命名为ninghao-theme.css  

c) git commit -m 'theme.css重命名为ninghao-theme.css'

移动文件进行提交

a) mkdir css    

b) git status    #未提示有什么变化,有什么要提交的修改,说明git只会跟踪文件,并不是目录,除非目录里面包含了文件

c) git mv ninghao-theme.css  css/        #移动文件,此时到暂存区 

d) git status     #提示了重命名,其实是移动

e) git commit -m '把 theme.css 移动到 css 目录下 '

f) mkdir asset

j) git mv css asset/    #移动目录,此时到暂存区 

k) git status     #提示了重命名,其实是移动

l) git commit -m '把 css目录 移动到 asset目录下 '

删除文件进行提交

a) git rm asset/css/ninghao-theme.css  (删目录 git rm -R 目录名)   #此时到暂存区  

b) git status     #提示删除了这个文件

c) git commit -m '删除了 asset/css/ninghao-theme.css '

在执行git rm 之前,这个文件要在当前分支(仓库)里面,并且没有将要被提交的修改(意思就是这个要删除的文件在工作区,暂存区,仓库里面的信息是一致的)

恢复文件的历史版本

新建目录css,把bootstrap.min.css放在css目录下,index.html引用这个bootstrap.min.css文件

a) git status   

b) git add .    #此时到暂存区  

c) git commit -m '添加了bootstrap框架'

新建目录js,把jquery.js放在js目录下,index.html引用这个jquery.js文件

d) git status   

e) git add .    #此时到暂存区  

f) git commit -m '添加了jquery.js'

g) git log    #查看提交的日志

git log --oneline   #用一行查看提交的日志

h) git revert d8e894b        # 恢复到这一步 d8e894b 之前 (仅仅是这一步之前的变化,它前后的commit都没有变化)    是提交的id号   到当前分支(repository)

提交重置           

        头部指针是一个很重要的概念,意思就是当前提交指向的id

        提交重置后,,以后的所有操作都失效了,并不仅仅是某一步的操作失效     

a) git status   

b) git log --oneline            #历史提交日志,内含提交的id


c) git reset --soft 79d8991        #这是重置到某个提交    --soft 只影响当前分支(仓库),不影响工作区和暂存区

d) git status                                  # 可以看到 --soft是怎么回事


e) git reset --mixed 79d8991            #只事实上默认就是 mixed,,,                --mixed影响当前分支(仓库)及暂存区,不影响工作区

f) git reset --hard 79d8991            #只事实上默认就是 mixed,,,                --hard影响当前分支(仓库)及暂存区,工作区,,三个都影响,,它们同时都一模一样了,同步了


stash 功能                   


stash 可以把修改暂时保存在一个地方,你可以稍后再把它拿出来继续使用

新建一个文件 humans.txt 里面加点内容

  a) git status   

  b) git  stash save '修改了humans.txt'            # 此时暂时保存了  humans.txt  工作区(工作目录)


  c) git status               # 提示工作目录是干净的

  d) git stash list          # 显示出保存的工作进度的列表              stash@{0}   表示某一个工作进度


  e) git stash show -p stash@{0}            # -p (patch)以补丁的方式,,,,,,,,查看保存的隐藏(stash )的工作进度

  f)  git stash apply  stash@{0}            # 恢复保存的隐藏(stash )的工作进度  ,,,把工作进度恢复到工作区(工作目录)


  g)  git stash drop stash@{0}             # 删除保存的隐藏(stash )的工作进度  ,,

  h) git stash list               # 显示出保存的工作进度的列表,此时没有了    

  i) git stash pop stash@{0}                #在恢复工作进度的时候,同时删除掉这个工作进度

查看日志功能  

  a) git log            #查看日志,f(forward)向下翻页 b(back)向上翻页  q(quit)退出


  b) git log --oneline        #显示一个简单的日志列表(单行)

  c)  git log --oneline  -5       #显示一个简单的日志列表(单行)只显示最近的5条

  d) git log --oneline --author="shipingzhong"        #指定某个作者的提交


 e) git log --oneline --grep="index.html"        #包含 字符串为 index.html 的提交

  f) git log --oneline --before="2014-07-05"          #2014年7月5日之前的提交

  g) git log --oneline --before="3 days"           #3天之前的提交


  h)  git log --oneline --graph        #有图表图形效果

  i) git help log        #查看帮助文档,手册

分支功能  


a) git status           #可以查看分支

b) git branch         #查看所有分支        前面星号*表示当前分支 默认第一个分支是master


c) git branch mobile-feather        #创建一个叫做mobile-feather的分支         似乎每一个分支(不同的分支)都有其独立的工作区,暂存区,仓库

d) git branch         #查看所有分支        前面星号*表示当前分支

e) git checkout mobile-feather        #切换到这个分支 mobile-feather 上 

f) git branch      #查看所有分支        前面星号*表示当前分支  


index.html里面添加img标签,再添加img文件夹及里面几个img图像文件

a) git status     

b) git add .            #提交到暂存区  

c) git commit -m '为index.html添加图像'         #    到当前分支(repository)

d) git log --oneline                


e) git log --oneline --decorate            #   --decorate显示的日志更详细一点     可看到head当前指针在mobile-feather分支上,也会看到master分支      

f) git checkout master         # 切换到主分支master    在vs code编辑器里面 回到了 master时的样子

g) git log --oneline --decorate            #   --decorate显示的日志更详细一点     可看到head当前指针在master分支上,为什么看不到mobile-feather分支

h) git log --oneline --decorate  -all        #会看到在所有分支上的提交      

i) git diff master..mobile-feather        #查看两个分支的区别,,master与mobile-feather中间是两个点

j)  git diff master..mobile-feather index.html        #查看两个分支的区别,仅仅对比 index.html文件  

分支功能fast-forward合并

a) git chekcout master      #查看当前分支为master

a) git branch      #查看当前分支为master

b) git merge mobile-feather        #合并 mobile-feather 到当前分支   执行后看到fast-forward,因为我们没有对当前分支master做新的提交,所以叫做 fast-forward 合并,,此时并不会产生新的提交,,,,,可以看到有描述信息  #就是工作区,暂存区,仓库同时都有了吧,同时都合并了吧

c) git log --oneline --decorate        #

d) git diff master..mobile-feather        #对比两个分支,没有区别

e) git status     

分支功能合并

a) git  branch      #查看当前分支为master

b) git checkout mobile-feather         #切换到这个分支 mobile-feather 上 


c) git  branch      #查看当前分支为mobile-feather

对 index.html 进行一些修改

d) git commit -am '为index.html添加web app meta标签'          # -a表示同时执行 get add . 的功能,就是 既到既暂存区    又到当前分支(repository 仓库)


e) git log --oneline   #以一行方式查看日志

f)  git checkout master        #切换到这个分支 master     上        ##创建新分支并立即切换到新分支:$ git checkout -b [name]   ##如果已经有该分支就不用 -b 了,-b是branch的意思吧       

在项目下面修改一下,新建一个文本文件 human.txt

a) git status           #

b) git add .


c) git commit -m '添加了human.txt'

d) git log --oneline --decorate --all -10 --graph        #以图形方式查看一下最近10行的所有提交  


e) git branch         #查看当前分支为master

f) git merge mobile-feather          #把mobile-feather合并到当前分支master上     此时因为我们已经对当前分支master做新的提交,所以不能叫做 fast-forward 合并,,,,,可以看到有描述信息

g)  git log --oneline --decorate --all -10 --graph            #以图形方式查看一下最近10行的所有提交 ,,,,,,,,,可以看到新的合并的提交

看  index.html 可以看到 在mobile-feather上作的修改

解决分支功能合并的冲突

a)   git checkout master        #切换到这个分支 master     上 

修改 index.html  的  title标签


b) git commit -am '修改index.html的标题为 MovieTalk'        # -a表示同时执行 get add . 的功能,就是 既到既暂存区    又到当前分支(repository)    

c)  git checkout mobile-feather             #切换到这个分支 mobile-feather 上 

d) git branch                 #查看当前分支为 mobile-feather 

再次修改 index.html  的  title标签,与master分支时不一样

e) git commit -am '修改index.html的标题为 Movie_talk'             # -a表示同时执行 get add . 的功能,就是 既到既暂存区    又到当前分支(repository)    

f) git log --oneline --decorate --all -10 --graph        #查看日志  

g) git merge master          #合并master分支到当前分支 mobile-feather 上,提示有冲突

   git merge --abort        #--abort是指放弃上一步的合并

image.png

解决分支冲突:我们可以删除不需要内容,留下需要的内容

image.png


h) git add .            #到暂存区

i) git commit         #不指定描述信息,会出现一个可编辑的内容,在里面编辑描述 ,,,此时commit其实就是合并分支了


j) git log --oneline --decorate --all -10 --graph        #查看日志 可以看到有冲突的合并的信息了   

重命名和删除分支

a) git branch bugfix        #新建一个分支bugfix    

b) git branch       ( git branch --list )               #查看当前所有分支

c) git branch   -m bugfix bugfix-1        # -m modify,move 修改,移动的意思 先是原分支名bugfix,后是新分支名 bugfix-1   

d) git branch --list                #查看当前所有分支

e) git branch -d  bugfix-1               # -d delete,删除的意思  删除分支

远程操作

先要在 github网站上创建一个远程仓库

a) git remote add origin https://github.com/shipingzhong/movietalk1.git                    #为项目添加一个远程仓库  remote 是子命令 add 是子子命令  origin 是远程名称,可以任意取名称,惯例是origin,,,,,,,,,https://github.com/shipingzhong/movietalk1.git   是远程仓库地址  


b) git remote                 #查看远程的名称

c) git remote -v                #查看远程的名称,显示更详细的信息 ( v  verbose )            # 显示的结果中有 fetch 用来提取,push 用来推送

    #    git remove rm  orgin                #移除这个远程  origin是远程的名字

d) git push -u origin master            #推送本地的仓库分支(master)到远程的分支(master)         -u,, --set-upstream 的简写形式,意思是去跟踪远程分支的变化(有和远程分支建立了联系)。origin 是远程名称,master是分支名称          本地分支与远程分支同名吧,,均为 master,,,,,,,,,,,,,,,,,,如果不跟踪的话 下一次直接执行     # git push 会报错,因为不知道推给谁,只能再次使用 # git push -u origin master  ###取消跟踪分支使用 --unset-upstream  吧    /node-admin/18323  关于分支,有大用

                git branch -vv        #可以显示本地分支与本地的远程分支的对应关系

                git checkout -b aaa origin/aaa       #如果不存在aaa分支,可以新建,并跟踪

                git branch -u origin/master        #设置当前分支跟踪本地远程分支origin/master

         git branch -u branch_1 origin/branch_2       # #设置 branch_1 分支跟踪本地远程分支origin/branch_2       

                git branch -u aaa   origin/bbb        #设置 aaa 分支跟踪本地远程分支origin/bbb        

                git branch --unset-upstream        #取消当前分支的跟踪


e) git branch -a             #-a all ,所有,, 显示出所有的分支(包含远程的分支)

f) git branch -r             # -r remote ,查看远程分支                  #命令结果会显示 这个origin/master,是远程分支,与本地分支一样的,只是不能切换而已, git会用origin/master来跟踪真正的远程版本库上的分支

g) git push origin mobile-feather                      #推送本地的仓库分支(mobile-feather)到远程的分支(mobile-feather) ,没有 -u,不跟踪远程分支的变化(本地分支和本地远程分支没有建立关联关系)        #推送mobile-feather分支,不必切换到这个分支上


git commit -m 后面 单引号与双引号的区别, 单引号,假如里面有空格,就会报错,所以最好用双引号

D:\angular\ninghao-angular>git commit -m '起步2 many file'

error: pathspec 'many' did not match any file(s) known to git

error: pathspec 'file'' did not match any file(s) known to git


D:\angular\ninghao-angular>git commit -m "起步2 many file"

[getting-started 08d2f8b] 起步2 many file

 14 files changed, 92 insertions(+), 11 deletions(-)

 create mode 100644 src/app/app.component copy 2.html

...................

删除清空清除 git 用户密码

image.png

远程克隆操作及fetch及fork及Pull request

假设张三用户登录后,把远程仓库克隆到本地

a) git clone https://github.com/shipingzhong/movietalk1.git  movietalk_zhang        #把远程仓库克隆到本地 放在 movietalk_zhang  目录下  (如果没有  movietalk_zhang        ,默认就是 远程仓库的名字 movietalk1 作为目录) 


进 movietalk 文件夹,修改 movietalk 里面 humans.txt文件


a)  git commit -am '修改了humans.txt'                    # 到暂存,至仓库

b) git push origin master                                                  # 推送到远程  ( 包含 刚刚提交的 commit )          

进 movietalk_zhang  文件夹

c) git status  

d) git fetch                                # 提取更新,并且把更新的东西放在了在本地上的 origin/master 这个分支上

e) git merge origin/master                # 把 origin/master 合并到当前分支 (只有 merge 时 才用到 origin斜杠master 这种格式,一般情况下是 origin空格master)           #就是工作区,暂存区,仓库同时都有了吧


f) git status  

李四进自己帐户,到项目的页面 https://github.com/shipingzhong/movietalk1  fork 一下

a) git  clone https://github.com/zzrwdcr/movietalk1.gi  movietalk1_li      #把远程仓库克隆到本地 放在 movietalk1_li目录下 (如果没有  movietalk1_li ,默认就是 远程仓库的名字 movietalk1 作为目录 ) 

进入到 movietalk1_li 目录下

a)  git config user.name '李四'                                                 #为单个项目配置用户名,没有--global

b)  git config user.email 'lisi@ninghao.net'                             #为单个项目配置邮箱,没有--global

添加 README.md  文件

添加一个 README.md 文件 里面加点内容

c) git  add .  

d) git commit -m '添加了README.md文件'

删除以前的 git登录凭证,

e) git push origin master           # 推送到远程,此时应该会提示用户名 密码   

  李四在自己的页面上   https://github.com/zzrwdcr/movietalk1.gi           Pull Request=>new Pull Request=>Edit=>create Pull Request=>create Pull Request

在我自己的页面上https://github.com/shipingzhong/movietalk1  , 会收到李四发来的 Pull Request,   点击 Pull Request,会显示所有发过来的 Pull Request ,,点击李四发来的 Pull request    ,,,,,,,,,,,,,,,,,  把这个请求里包含的提交,合并到我们的版本库里面,,,,,,,,,,,,,,,,  如下图,可以合并   Merge pull  request,,,,,,Confirm merge,,,,合并之后,在github上会做一次提交

image.png

image.png

小雪登录 github,  拿到  movietalk1  版本库地址

a) git  clone https://github.com/shipingzhong/movietalk1  movietalk1_xiao      #把远程仓库地址克隆到本地 放在 movietalk1_xiao      目录下 (如果没有  movietalk1_xiao      ,默认就是 远程仓库的名字 movietalk1 作为目录 ) 

到 movietalk1_xiao 目录下


b)  git config user.name '小雪'                                                 #为单个项目配置用户名,没有--global

c)  git config user.email ' xiaoxue@ninghao.net'                             #为单个项目配置邮箱,没有--global

小雪修改 README.md 这个文件

d) git commit -am '修改了 README.md文件'                      # -a表示同时执行 get add .       的功能,就是 既到既暂存区    又到当前分支(repository)

删除清空清除 git 用户密码 (见上面的图)

e) git  fetch                          # 提取更新,并且把更新的东西放在了在本地上的 origin/master 这个分支上

f) git push  origin master                       #  origin 是远程仓库名,默认就是 origin 吧     ,,,,,,,,,,,,,,,,,,,,     master 是分支名 

在   https://github.com/shipingzhong/movietalk1  页面上的提交 ,会看到最后一个提交是小雪

git图形工具似乎有git add . (到暂存器)的功能,,,好像这个功能是 git commit 功能都是合在一起的

 Brackets Git 扩展似乎也没有git add .  (到暂存器)的功能,,,好像这个功能是 git commit 功能都是合在一起的


给项目打标签     

  关于标签可以看看  /node-admin/18334   


新建某目录 ninghao-git,在里面新建一个文件 README.md

到  https://github.com/shipingzhong/movietalk1  页面     setttings=>collaborator=>搜用户名,添加协作者

image.png

 

a) git init     #初始化一个仓库

a) git add .

a) git commit -m 'init'

修改 RRADME.md 内容为 hello

a) git add .

a) git commit -m 'hello'

a) git tag        #查看项目所有标签,此时没有标签

a) git tag v0.1            #给当前提交打个标签 v0.1

a) git tag                    #查看所有标签   可以看到v0.1这个标签

a) git show  v0.1               #查看v0.1这个标签,会显示这个tag指向的commit

修改 RRADME.md 内容为 hola

a) git commit -am 'hola'            #到暂存,又提交一下

a)  git tag -a v0.2 -m 'hola'               # #给当前提交打个标签 v0.2  -a表示Annotated,注释的意思  这里表示注释为 v0.2 , - m是message,表示注释内容,,,,本来是不需要-a的,但是这里有个-m 所以才需要-a     

a) git show v0.2     

a) git chekout  v0.1            #切换到v0.1时,项目的样子    RRADME.md 内容为 hello


a)  git chekout  v0.2            #切换到v0.1时,项目的样子    RRADME.md 内容为 hola                   

a) git log                #查看日志            #我们复杂一下init时的id    6b4380e2f 是前几个数字,反正不复复吧 

a) git tag -a v0.0  6b4380e2f  -m 'hola'           #给某一个提交 打上标签   ,,,,,,,6b4380e2f 是init提交时的id的前几个数字       

a) git tag                 #查看有几个标签            

a) git show v0.0                #查看v0.0这个标签,会显示这个tag指向的commit

a) git branch                      #看到当前的tag 和分支

a) git  checkout master             #切换到 master 分支

a) git tag           #查看所有标签  

a) git tag -d v0.0            #-d,delete删除 ,,,删除标签 

a) git tag           #查看所有标签  , v0.0没有了            

a) git push origin v0.2             #推送某一个标签到远程 

a) git push -- tags                       #推送所有标签到远程 


01-02)简单的配置 - git config

安装了 git 以后,我们需要简单的去配置一下,比如告诉 git 我们是谁,想要使用的编辑器,还有浏览器是什么等等。git 的配置有三个范围。 首先是 system,系统范围。在这个级别的配置会影响到整个系统,也就是不管你使用哪个用户登录到系统上,git 都会使用这个系统范围的设置。

针对用户来的设置属于 global ,全局范围。在这个范围上去配置 git ,不同的用户可以拥有自己的配置。另外,我们也可以针对项目范围内来设置 git 。

一般我们会在用户范围内去配置 git ,也就是在 global 范围内去设置。

首先我们需要告诉 git 自己是谁,可以去设置一下用户名还有 Email ,这些信息会包含在 commit 提交里面。

git config 后面加上配置的应用范围... 这里是 global ... 然后是要配置的选项 ... user.name ... 加上一个空格,后面是我的名字 ...

git config --global user.name '王皓'

再去查看一下配置信息 ...

git config --list

你会看到 user.name 这个配置信息。如果要重置配置选项,可以使用一个 unset 参数。

git config --unset --global user.name

这样就会去掉在全局范围内的 user.name 的设置。

git config --list

我们再重新设置一下用户名 .... 然后再设置一下用户的 Email...

git config --global user.email 'wanghao@ninghao.net'

想要让 git 输出的东西带点颜色,还需要一个配置 ...

git config --global color.ui true

把 color.ui 设置成 true ...

我们在全局范围里做的这些配置,会保存在一个叫 .gitconfig 的文件里面。这个文件会放在当前用户的主目录下面 .. 我们可以使用 cat 命令查看一下这个文件里的东西 ...

cat ~/.gitconfig

这个波浪号就表示当前用户的主目录 ... 你会看到这个文件里面会分成了几个区域 ... color 这个区域里, ui 等于 true ... 另外还有一个 user 区域 ... 里面设置了用户的名称,还有 Email 地址。

来自  https://ninghao.net/video/1884

01-03) 别名 - alias

我们可以给经常使用 git 命令,去添加一个别名,这样可以简化一下我们经常输入的 git 命令。

设置别名,用的是 git config ... 然后指定一下别名应用的范围,一般我们可以在用户级别,也就是全局范围内去设置别名。 --global ... 表示全局范围。然后是 alias ,加上一个点,接着是命令的别名 ... 比如设置一下 checkout 的别名,设置成 co ... 空格 ... 最后是要添加别名的命令 ... 这里就是 checkout ...

git config --global alias.co checkout

给这个 checkout 命令添加的别名的配置,会保存在用户主目录下面的 .gitconfig 这个文件里面 ... 我们可以查看一下这个文件 ...

cat ~/.gitconfig

你会看到一个 alias 区域,下面有一行 co 等于 checkout ,表示 checkout 这个命令的别名就是 co ...

[alias]
co = checkout

下面,我们可以试一下。比如要切换到 mobile-feature 这个分支上 ... 输入 git 然后加上 checkout 命令的别名 ... co ... 接着是分支的名称 ...

git co mobile-feature

.bash_profile

这种为 git 命令设置别名的方法是 git 提供的 .. 另外,我们也可以在系统上去设置命令的别名 ... 可以去编辑一下用户的 .bash_profile 文件 ...

vim ~/.bash_profile

然后输入 alias ... 空格,接着是要设置的命令的别名 ... 比如我们要设置一下 git checkout 这个命令的别名 ... 输入 gco ... 等于 ... 一组引号 .. 引号里面是要设置别名的命令 ... 'git checkout'

这样,我们在命令行里,直接输入 gco ,就相当于是输入了 git checkout ... 保存一下 ... 关掉终端工具,再打开以后,刚才设置的别名就会生效了 ... 或者,可以使用 source ,去更新一下 .bash_profile

source ~/.bash_profile

再试一下刚才设置的 gco 这个别名 ... 输入 gco ,这就相当于是输入了 git 空格,checkout ... 后面加上分支的名称 ... master

gco master

你可以使用这个方法,继续去给其它的命令添加别名。

来自 https://ninghao.net/video/1903#toc


01-04) 忽略跟踪文件 - 全局范围

有时候在项目里的一些文件我们不想让 Git 去跟踪,这些文件可能是系统生成的临时文件,也可能是项目本身生成的一些临时文件,或者其它不想保留的文件。

我们可以告诉 Git ,忽略掉这些不想跟踪的文件。可以在全局范围里设置一些要忽略的文件,比如在 Mac 系统上,有时候会在目录里面生成 .DS_Store 的文件,因为文件名里面带一个点,所以默认它是隐藏的,这个文件会存储目录的显示属性,一般我们不希望让它出现在项目的版本库里面。

这样我们就可以在全局范围里面,让 Git 忽略掉这个文件。

我们要做的就是去创建一个文件,在文件里输入要忽略掉的文件的列表,再去执行一行命令,告诉 Git 在全局范围里要忽略掉的文件。

git config --global core.excludesfile ~/.gitignore_global

这行命令就是告诉 Git 全局范围内要忽略掉的文件列表在 .gitignore_global 这个文件里面。

下面我们可以去编辑一下这个文件 ..

vim ~/.gitignore_global

输入 .DS_Store ... 保存一下 ...

这样在全局范围内,也就是操作系统当前这个用户的下面,不管在哪个版本库里面,Git 都会忽略掉 .DS_Store 这个文件。

打开一个版本库 ...

在里面创建一个 .DS_Store 文件 ...

然后再查看一下状态 git status ...

显示目前工作目录是干净的,并没有显示刚才创建的没有跟踪的文件 ... 因为我们已经告诉 Git 忽略掉它了。

另外,还有一些可以在全局范围内忽略的文件,你可以参考这个地址。

https://gist.github.com/octocat/9257657  


来自  https://ninghao.net/video/1904


01-05) 忽略跟踪文件 - 项目级别


我们可以为每个项目单独去创建一个要忽略掉的文件列表,方法是,在项目的根目录下面,去创建一个 .gitignore 的文件,在这个文件里,我们可以列出要忽略掉的文件。

下面,我们去创建一个这样的文件 ...

在项目的根目录下,去创建这个文件 ... 先进入到项目 ...

vim .gitignore

编辑一下 ...

比如我想忽略跟踪所有扩展名是 .log 的文件,一般就是一些日志文件 ...

可以输入一个星号,然后是扩展名, 星号表示做任意的字符 ..

*.log

另起一行,可为继续去配置这个忽略的文件列表。完成以后,保存一下 ...

然后再去提交一下。

git add .
git commit -m '添加了 .gitignore 文件'

下面,我们再试一下这个忽略规则有没有效果 ...

创建一个 .log 的文件 ...

touch access.log

查看一下状态 ...

git status

显示工作目录是干净的 ... 说明 Git 已经忽略掉了以 .log 为扩展名的文件。

要注意的是,Git 不会忽略掉已经被跟踪了的文件,如果你想忽略掉这些文件,可以使用 git rm 加上 cached 选项,再指定一下文件名称,这样可以取消跟踪指定的文件。

这样配置的忽略的规则才会生效。

模板

另外,很多项目都有一些特定的文件需要被忽略,比如 Ruby,WordPress,Drupal ... 你可以参考这个地址提供的 .gitignore 的模板,去为项目添加这个 .gitignore 文件。

https://github.com/github/gitignore

来自  https://ninghao.net/video/1905#info



02-01)初始化 - git init
 

 

这个视频我们去初始化一个项目,用的是 git init 命令。init 是 initialize 的简称。想用 git 去控制和管理项目,首先要做的就是去初始化一下。

我们先找个地方,去为要做的项目新建一个目录 ... 进入到用户的桌面上 ... # mkdir  movietalk ... 在桌面上新建一个叫 movietalk 的目录,我们会把项目需要的所有的文件放在这个目录的下面。

mkdir movietalk

然后再进入到这个目录 ...

cd movietalk

再去执行 git init ... 去初始化一下 ...

git init

会返回初始化了一个空白的 Git repository ... 就是这个 .git 目录 ... git 会把它需要或者生成的东西都放在这个目录里面。

Initialized empty Git repository in /Users/phoenix/Desktop/movietalk/.git/

有了这个 repository 以后,Git 就会跟踪 movietalk 这个目录里面所有文件的变化,这样就可以使用 Git 提供的版本控制功能了。

下面我们先进到这个 .git 目录里看一下 ... movietalk 这个目录下面的 .git 这个目录 ...

cd movietalk/.git

然后用 ls 命令去查看一下这个目录里的东西。

ls -a

你会看到一些文件还有目录 ... 这些东西就是在初始化以后给我们生成的... 他们都有不同的功能,我们会在后面的视频里,需要的时候再回来看一下 ...

通过情况下,我们不会动这个目录里面的东西,除了这个 config 文件,它的作用是存储项目级别的配置信息。

这个初始化的动作,一般只需要执行一次就可以了。另外,如果你不想再让 Git 跟踪 movietalk 这个项目了.. 直接就可以把这个目录下面的 .git 目录删除掉就行了。

还有要注意的是在 UNIX 类型的系统里面用 . 开头的文件或者目录默认会被隐藏起来 ... 比如 Mac 或 Linux ... 所以默认情况下,你在图形界面上看不到这些文件或者目录 ...

在 Mac 上,你可以用终端工具,使用 open 命令,用 Finder 打开隐藏的目录 ..

Windows 用户应该可以直接在图形界面上打开并且打开这些目录和文件。

02-02)提交 - git commit
 

一个提交的大概的流程是这样的,先去对项目进行修改,比如添加新的文件,或者修改已有的文件,然后告诉 git 要提交的都有哪些修改以后的文件,确认以后再去提交一下,提交的时候要修改一条描述的信息。

打开终端工具,进入到我们项目所在的目录 ... 然后用 git status 命令,去查看一下当前的状态。

git status

这里会显示当前我们所在的分支,On branch master,表示是在 master 这个分支,这个是项目的主分支,以后面的视频里,我们会介绍什么是分支,怎么样去创建新的分支。

Initial commit ,初始的提交 ... commit 就是提交的意思。

nothing to commit ... 表示目前没有什么可以提交的东西。

下面,我们去在项目里添加一个新的文件... 这里我用的是 Brackets 编辑器 ... 打开项目所在目录 ... 新建一个 html 文件.. 命名为 index.html ...

在里面输入点内容 ... 这是一个基本的 html 文档的模板 .. 保存一下 ... 回到 终端工具 ... 再运行一下 git status 命令 ..

Untracked files ... 这回 git 发现了一个还没有进行跟踪的新文件 .. 也就是我刚才创建的 index.html 这个文件 ...

如果我们想提交一下,需要先去添加一些修改的文件,然后再去执行提交 ... 添加,可以使用 git add 命令 ..

git add 后面是具体的文件的名称 ... 这里也可以使用一个点,表示添加所有修改的文件。

git add index.html

再运行一下 git status 去查看一下状态 ...

这回提示说 Changes to be committed ... 将要被提交的修改 .. 有下面这些东西 ... new file ,一个新的文件 .. index.html ...

确定提交,用的是 git commit ... 提交的时候我们需要去指定一个提交的描述信息 ... 这个信息非常重要,尽量去描述清楚,这样提交所做的事情。

可以使用一个 m 参数 ... 后面跟着是提交的描述信息,如果不加 -m 参数的话,git 会打开默认的文本编辑器,让你输入一条提交的信息 ... 这里我们直接使用一个 m 参数 ...

git commit -m '添加 index.html 文件'

回车以后,就完成了我们的第一次提交。

再去查看一下当前的状态 ... git status ... 提示 nothing to commit, working directory clean ,现在工作目录是干净的,没有啥可以提交的。

查看一下以往的提交,可以使用 git log 命令 ...

git log

因为我们只做了一个提交,所以这里只显示一个 ... 上面有 commit ,提交的 ID 号 ... 提交的人是谁,提交的日期,还有提交的时候撰写的描述信息。

02-03)对比区别 - git diff
 

下面,我们可以去修改一下项目里的 index.html 这个文件... 直接用文本编辑软件打开它 ... 经如去改一下 html 标签上的 lang 属性,这个属性表示网页使用的语言,这里是 en ,我们把它改成简体中文,zh-hans ...

回到终端工具 ... 然后用 git status 去查看一下 ...

这回提示说 ... Changes not staged for commit ,这里有一些要提交的修改,不过还没有把它们放在暂存区里面。modified ,修改的文件是 index.html 。

查看不同

想查看一下这个文件修改前还有修改后的区别,可以使用 git diff 命令... 在它后面可以加上想要查看区别的具体的文件的名称 ... 不加的话,会显示所有修改文件的区别。

git diff index.html

这行命令会去对比 index.html 这个文件,在 repository 里面版本,跟在工作目录里面的版本之间的区别。这里显示的是,去掉了 html lang 等于 en 这行代码,减号,表示去掉了这行代码。然后添加了一行新的代码 .. html lang 等于 zh-hans 。

虽然这里我们只修改了这个 lang 属性的值,不过对于 git 来说,它是一行一行对比的。

git 会在这里给出修改前后的几行代码作为参照。

下面,我们把这个修改添加到暂存区 ...

git add index.html

查看一下状态 ... git status ... 显示一个要提交的修改 ... 然后再用 git diff 去查看一下区别 ...

git diff

这回没有显示了 ... 因为我们已经把修改添加到了暂存区,所以,再次比较的时候,会用暂存区里面的东西跟工作目录里面的东西进行比较。

下面我们再去修改一下 index.html ... 这里给这个文档添加一个 viewport 的 meta 标签,这行标签可以让文档针对移动设计进行优化,你可以参数宁皓网的 《响应式网页设计》这个课程。

meta:vp

回到终端,先查看一下状态 ... git status ... 你会发现,暂存区里已经有了一个修改,是来自 index.html 这个文件 ... 另外,还显示,有些修改没有放到暂存区,这个修改同样是来自 index.html 这个文件。

这是因为,第一次修改了 lang 属性的值,这个修改已经放到了暂存区准备提交,随后,我们又给 index.html 添加了一个新的 meta 标签,这个修改还没有放到暂存区里。

再去对比一下跟工作目录里的区别 ...

git diff

这里对比的结果是,暂存区里的东西跟工作目录的对比。如果你想比较的是 repository 跟暂存区的东西,可以使用一个 staged 选项。

git diff --staged

在 repository 跟暂存区里面,index.html 的区别是,lang 这个属性的值 ... 我们先提交一下这个修改 ...

git commit -m '修改了 index.html 的 lang 属性值为 zh-hans'

git status ... 显示还有一处修改没有提交 ...

git add 添加一下这个修改 ... git add index.html

然后再提交一下 ...

git commit -m '为 index.html 添加了 viewport meta 标签'

再去查看一下提交的日志 ...

git log

这里会显示出我们做的这三个提交的信息。

02-04)重命名 - 直接在文件系统上重命名
 

这个视频我们来看一下怎么样重命名 git 已经跟踪的文件。先打开项目,然后新建一个文件 ... 叫它 style.css ... 在里面添加点样式 ..

h1 {
font-size: 30px;
}

保存 ... 回到终端 ... 查看一下状态 .. git status ... 提示有一个没有跟踪的文件 ... 下面我们去提交一下这个修改 ...

git add .

把所有的修改添加到暂存区 ... 一个点表示所有的修改 ..

再执行 git commit ...

git commit -m '添加 style.css 样式表'

git status ... 现在工作目录已经干净了 ... 我们再去重命名一下这个 style.css 文件,可以直接在文件系统上去重命令,也可以使用 git 的命令去重命令 ...

打开项目所在的目录 ... 把 style.css 重命令为 theme.css ...

回到终端 ... 查看一下状态 git status ... 这里会提示说 .. 删除了 style.css 文件,然后还有一个没有跟踪的 theme.css 这个文件...

目前 git 还不知道我们只是重命名了文件 ...

先用 git rm 命令,告诉 git ,我们要从工作目录里面删除掉 style.css 这个文件 ...

git rm style.css

然后再用 git add 去添加 theme.css

git add theme.css

这回再去查看一下状态

git status

提示 renamed ,把 style.css 重命名为了 theme.css

再去提交一下这次修改 ...

git commit -m '把 style.css 重命名为 theme.css'


02-05) 重命名 使用 git mv 重命名
 

使用 git mv 我们可以直接重命名或者移动文件和目录。比如我们要把 theme.css 重命名为 ninghao-theme.css ... 输入 git mv 然后是要重命名的文件,theme.css ... 接着是这个文件的新名字. ... ninghao-theme.css

git mv theme.css ninghao-theme.css

再查看一下状态 ..

git status

这里直接会显示一个重命名的修改,并且这个修改已经在暂存区里面了。下面再去提交一个这个修改。

git commit -m '把 theme.css 重命名为 ninghao-theme.css'

移动

下面,我们再看一下移动文件,其实移动文件跟重命名文件是差不多的,同样使用 git mv 命令 .. 我们先在项目所在的目录里面去新建一个目录 ... 叫它 css

然后,再去把 ninghao-theme.css 这个文件移动到 css 这个目录的下面 ...

这里,可以先去查看一下状态 ... git status ...

你会发现,没有出现要提交的修改 ... 这是因为,git 只会追踪文件 ... 并不是目录 ... 除非这个目录里面包含文件 ... 也就是 git 不会跟踪空白的目录 ...

下面,我们用 git mv,把 ninghao-theme.css 放在 css 这个目录的下面 ...

git mv ninghao-theme.css 后面指定一下这个文件的新的位置 ... 同时,你也可以去为这个文件指定新的名称 ... 这里我们并不打算去重命名它,所以,直接输入这个文件的新的位置。

git mv ninghao-theme.css css/

查看一下状态 git status ... 同样这里会提示一个 renamed ... 重命名了文件 ... 只不过这个重命名的动作里面包含了一个文件的路径。 也就是把 ninghao-theme.css 这个文件放在 css 这个目录的下面,移动以后,这个文件还叫 ninghao-theme.css ...

再去提交一下 ..

git commit -m '把 ninghao-theme.css 移动到 css 目录下'

重命名或移动目录

重命名和移动目录也可以使用 git mv ... 下面,我们再去新建一个目录 ... 然后把 css 这个目录放在这个新的目录下面 ...

新建目录可以使用 mkdir 命令 ... 创建一个叫 asset 的目录 ...

mkdir asset

然后把 css 这个目录放在这个 asset 的下面 ... git mv css ,后面是 css 这个目录的新的位置 .. asset ,后面加上一个斜线 ...

git mv css asset/

git status 查看一下状态 ... 提示这个修改是把 css 这个目录,还有它里面包含的东西,都移动到了 asset 这个目录的下面 ...

最后再提交一下...

git commit -m '把 css 移动到 asset 目录下'

02-06)删除文件 git rm
 

要从项目里面删除掉 git 已经跟踪了的文件,也有两种方法,一种就是直接从文件系统里面,找到想要删除的文件,把它们放在垃圾箱里,再用 git rm 命令,把这些文件或目录从 git 里面删除掉。 另一种就是直接使用 git rm 命令去删除文件。

比如我们要删除掉 asset/css 这个目录下面的 ninghao-theme.css 这个文件... 你可以在文件系统里面找到这个文件,再把它放到垃圾箱里,或者,使用 git rm ,直接删除它

输入 git rm ... rm 表示 remove ,也就是移除的意思 ... 后面是要删除的具体的文件名称,要删除多少文件,可以使用空格分隔开不同的文件名 ... 如果你要删除掉整个目录,包括目录里面的所有的文件 ... 可以加上一个 -r 参数,然后再加上目录的名称 ... 这里我们要删除的是单个文件 ... 可以直接指定这个文件所在的位置 ..

git rm asset/css/ninghao-theme.css

再查看一下状态 git status ... 提示有一个将要被提交的修改, deleted .. 删除了 asset 下面的 css 这个目录里的 ninghao-theme.css 这个文件 ...

这个时候,ninghao-theme.css 已经从工作目录里面删除掉了 ... 下面去提交一下 ...

git commit -m '删除了 asset/css/ninghao-theme.css 样式表'

这里要注意是,在使用 git rm 命令删除文件之前,要确定这个文件已经在 git repository 里面,并且没有将要被提交的修改 ... 也就是如果你修改了想要删除的文件,但是还没有提交它,git 不会让你删除掉这个文件,你需要添加修改,并且提交以后,才能删除它。

02-07) 恢复刚刚删除或修改的文件

使用 git rm 可以删除文件,在没有提交或者提交以后,我们都可以把删除的文件恢复过来。下面我们删除掉 index.html 这个文件 ... 然后再把它恢复过来 ...

git rm index.html

再查看一下目录下面的东西 ... ls ... 现在已经看不到 index.html 这个文件了 ... 再查看一下状态 ... git status ... 提示当前有一个要被提交的修改,就是删除了 index.html 这个文件 ...

如果现在,我们改主意了 .... 不再想删除 index.html ,把它恢复过来,可以使用 git checkout 命令 ... 这个命令有很多功能 ... 我们先用它来恢复一下文件 ...

git checkout ... 后面加上一个 HEAD ... 表示最近一次提交 ... 后面是两条横线,表示当前的分支 ... 后面我们会详细的介绍分支 ... 一个空格,接着是要恢复的文件的名称 ... 这行命令的意思就是,把 index.html 这个文件恢复到最近一次提交的状态...

git checkout HEAD -- index.html

再输入 ls ... index.html 这个文件又回来了 .. 再查看一下状态 git status ... 现在工作目录是干净的 ...

删除文件并提交以后,我们也可以使用这行命令把文件恢复过来 .. .

git rm index.html

再去提交一下 ...

git commit -m '删除了 index.html'

ls 查看一下当前目录里的东西... index.html 已经不在了 ... git status 再查看一下状态 ... 工作目录现在也是干净的 ..

这个时候想要恢复 index.html ... 我们需要把 index.html 恢复到最近的上一次提交的状态 ... 因为最近一次提交是 删除 index.html ... 上一次提交应该注是在没有删除它之前的状态 ...

git checkout HEAD ... 在 HEAD 的后面,可以加上一个向上的箭头,表示最近提交的上一次提交 ... 两个箭头表示上两次提交 ...

git checkout HEAD^ -- index.html

ls 列出目录里的东西... index.html 已经在工作目录里了 .. 再查看一下状态 git status ....

提示准备要提交的修改是一个新的文件 index.html ... 再去提交一下 ...

git commit -m '恢复了 index.html'

使用介绍的这个方法,不仅仅可以恢复删除的文件 ... 如果你对文件做了一些修改 ... 想把它恢复成最近提交的状态 ... 同样可以使用这行命令 ...

02-08)恢复文件的历史版本 - git revert
 

先在项目下面新建一个目录 ... 叫做 css ... 然后把 bootstrap 的样式表放在这个目录的下面 ...

再打开 index.html ,把这个 Bootstrap 的样式表嵌入到项目里面 ...

回到终端 ... git status ... 查看一下状态 ... 然后再添加这些修改 ... git add .

提交一下 ...

git commit -m '添加了 Bootstrap 3 框架'

下面我们再去做一些修改 ... 回到项目 ... 再新建一个目录 ... 命名为 js ... 把 jQuery 放到 js 这个目录的下面 .. 再打开 index.html ... 嵌入这个脚本文件...

git status ... git add . 再用 git commit 提交这次修改 ...

git commit -m '添加了 jQuery 2.1.1'

再用 git log 查看一下提交的日志 ...

假设我们现在改主意了,不想再项目里使用 Bootstrap 这个框架了。可以使用 git revert 命令,这个命令可以恢复已有的提交 ...

添加 Bootstrap 的这个提交的 id 是 xxxx ... 使用 git revert ,配合这个 ID 号,可以恢复这个提交 ... 也就是在这个提交里对文件所做的修改都会恢复到提交之前的状态 ...

先复制一下这个提交的 ID 的一部分 ... 一小部分应该就可以让 git 识别到这个提交了 .. 然后输入 git revert ... 后面加上要恢复的提交的 ID 号 ...

git revert xxxx..

回车以后,会立即执行这个恢复的提交 ... git 会打开配置的默认的编辑器 ... 让我们输入一下关于这个恢复提交的描述信息 ...

你可以编辑一下这个信息,或者使用 git 给我们提供的这个默认的信息 ... 保存一下 ...

用 git log 查看一下提交的日志 ... 这里,你会看到最近的这次恢复的提交 ...

再回到我们的项目 ... 打开 index.html ... 你会发现,链接 Bootstrap 样式表的那行代码已经不在了 ...

项目下面的 css 这个目录也不在了 ... 因为这些修改都是在那次 添加 Bootstrap 的提交里面 ... 我们使用 git revert 恢复了这次提交 ... 所以,所有的修改也就会恢复成之前的样子 ...

02-09)重置提交 - 控制头部指针 - git reset

默认情况下,每一次提交以后,头部指针都会指向最后这次提交,使用 git reset ,我们可以控制这个指针的位置,比如我们让它指向之前的某次提交,这样,下面再提交的时候,会覆盖掉之后的所有的提交。

git reset 有几个选项,--soft ,软重置,使用这个选项重置提交,不会影响到工作目录还有暂存区里的东西。 另外还有一个 --hard 选项,它会把工作目录还有暂存区,直接重置到指定的提交状态。默认是 --mixed ... 使用这个选项会把暂存区里的东西重置到指定提交 的状态,并且会把指针指向这个提交。

--soft

这个视频我们先来看一下 --soft 类型的重置。 git log 查看一下提交的日志 ...

比如我们要从 添加了 modernizer 这个提交往后开始覆盖 ... 先复制一下这几个提交的日志 ...

粘贴到一个文件里面 ... 如果你用的是 brackets 编辑器 ... 可以在工作区这里新建一个临时的文件 ...

然后复制 添加了 modernizer 这个提交的 ID ....

回到终端 ... 输入 git reset 后面加上 soft 选项 ... 然后是要定位的提交的 ID ...

git reset --soft xxx ...

现在,指针会指向 xxx 这个 ID 上。用 git log 看一下 ...

这里显示最近一次提交就是这个 添加了 modernizer ... 然后我们用 git status 再看一下状态 ...

删除了 semantic-ui.css 还有修改了 index.html 这两个修改都已经在暂存区里面了 ... 提交以后就会覆盖掉刚刚的 恢复 semantic ui 这个提交了 ..

--mixed

我们再看一下 mixed 这个选项 ... 向上 ... 把 --soft 换成 --mixed ... git reset 命令默认就是这个选项 ... 所以, 你也可以不用指定这个选项 ...

回车 ... 再用 git status 查看一下 ... 暂存区里的东西不见了 ... 我们需要使用 git add 或者 git rm 重新把修改添加到暂存区 ... 然后再去提交 ...

--hard

最后,我们再看一下 --hard 选项。把 --mixed 修改成 --hard ... 回车 ... git status ... 提示干净的工作目录 ... 说明已经重置了 暂存区 ... 再打开项目 ...

你会发现,删除掉的 css 目录,还有 index.html 里面链接 semantic ui 的代码,已经恢复过来了 ... 也就是当前的状态,工作目录还有暂存区的状态,已经恢复到了 添加了 modernizer 这个提交以后的状态 ...

这个时候,我们仍然可以重置到 Revert "添加了 semantic ui 框架" 这个提交 ...

复制一下这个提交的 ID ...

git reset --hard xxx

回车 ... 打开项目 ... 你会看到 css 目录已经不在了 ... index.html 里面链接 semantic 框架样式的代码也不见了 ...

说明现在,又重置到了 Revert "添加了 semantic ui 框架" 这个提交之后的状态了。

03-01)分支 - branch
 

想要为项目添加新的特性,但不太确定到底可不可行,或者要修复项目的 bug 的时候。这个时候我们可以去为项目创建一个分支,然后在分支上,你提交对项目的修改,完成以后,我们可以再把分支合并到一块。

查看当前所在的分支,可以使用 git status ...

git status

这里会显示 On master branch ... 在主分支上 ...

查看项目上的所有的分支可以使用 git branch 命令 ...

git branch

目前只有一个分支,就是这个 master 分支 ... 注意,在这个分支名称的左边有一个星号,表示当前的位置是在 master 这个分支上 ...

创建一个分支,同样可以使用 git branch 命令 ... 输入 git branch ... 后面加上要创建的分支的名称 ... 比如我们想要为项目去添加一些针对针对设备优化的功能 ... 我们可以去创建一个分支,在这个分支上去做修改 ... 如果可行,再把这个分支合并到主分支上 ... 如果不可行,可以直接删除掉它 ... 不会影响到 master 分支或任何其它的分支 ..

这里我们可以叫它 mobile-feature ...

再用 git branch 查看一下所有的分支 ...

git branch

你会看到刚才创建的分支 ... 要在这个分支上去修改项目 ... 需要先切换到这个分支 ... 用的是 git checkout ... git checkout 后面加上分支的名称 ... mobile-feature ... 回车 ... 提示 Switched to branch 'mobile-feature' ... 已经切换到了 mobile-feature 这个分支上 ...

git checkout mobile-feature

用 git status 或者 git branch 去查看一下当前所在的分支 ...

git branch

当前的分支是 mobile-feature ... 当前的分支的名称会是绿色的,并且它的左边有一个星号 ...

03-02)在分支上修改
 

这个时候,我们对项目进行的修改只会影响到 mobile-feature 这个分支,下面可以去修改一下 ... 打开 index.html ... 粘贴一段代码到这个文档里面 ... 这几行代码的作用就是去为项目针对移动设备添加一些快捷图标。比如用户用移动设备打开项目的时候,选择 添加到桌面,在这里指定的就是不同尺寸的桌面图标 ...

还需要一些图像文件 ... 你可以在资料包里找到 ... 把它们复制到项目所在的目录 ...

回到终端工具 ... 先去查看一下状态 ... 你会看到一些修改 ...

git status

下面,我们再去提交一下 ..

git add .

把所有的修改都添加到暂存区 ... 然后再去提交一下 ..

git commit -m '为 index.html 添加移动设备快捷图标'

提交以后查看一下提交日志 ... git log ... 这里我们使用一个 oneline 选项。这样每行会显示一个提交 ..

git log --oneline

当前我们的位置是 mobile-feature 分支,最后一次提交是 添加移动设备快捷图标 这个提交 ... 它的下一个提交是 Revert '添加了 semantic ui 框架' 这个提交 ...

这个提交是创建 mobile-feature 这个分支之前的提交 ..

我们可以再用一个 decorate 选项,显示的更详细一点 ...

git log --oneline --decorate

你会看到当前的 HEAD 指针是在 添加移动设备快捷图标 这个提交上 ... 这个提交是在 mobile-feature 这个分支上做的 ... master 最后一次提交是 xxxxxx

下面,我们再切换到 master 这个分支去看一下 ... 注意在切换以后,项目里,index.html 这个文件,还有这个 img 目录的变化 ...

git checkout master

回车 ... 你会发现 ... 在 mobile-feature 分支上提交的修改已经不见了 ... index.html 文件又恢复成了最后一次在 master 分支上提交的样子 ... img 这个目录也不在了 ... 因为这些修改是在 mobile-feature 这个分支上提交的 .. 所以不会影响到 master 这个分支 ...

查看一下日志 ...

git log --oneline --decorate

在 master 这个分支上 HEAD 指针是在 Revert '添加了 semantic ui 框架' .. 也就是 xxxx 这个提交上 ...

在最后再加上一个 all 选项,可以查看所有分支上的提交 ...

git log --oneline --decorate --all

所有分支上的提交,包含在 mobile-feature 这个分支上的那次提交。

03-03)对比分支区别
 

用 git diff ,我们可以查看一下两个分支之间的区别 ... git diff master 中间加上两个点 ... 然后是另一个要对比的分支名称 ... mobile-feature ..

git diff master..mobile-feature

执行这行命令会显示出这两个分支的所有的区别 ... a 表示两个点左边的分支 .. 也就是 master 这个分支,b 表示 mobile-feature 这个分支 ... 对比 master 这个分支来说 ... mobile-feature 这个分支上多了一些新的二进制文件... 也就是快捷图标图像文件..

按下 f 可以向下翻页 .. 在最后还可以看到 index.html 这个文件的区别 ... 相对 master 这个分支,mobile-feature 添加了几行新的代码 ...

在对比的时候,我们也可以指定要对比的文件... 比如只想比较 index.html 这个文件的区别 .. 可以这样 ... 先按一下 q ,退出 ... 然后在这行命令的后面加上要对比的具体的文件的名称 ..

git diff master..mobile-feature index.html


03-04)合并分支 fast forward
 

假设我们在 mobile-feature 分支上添加的新功能也想应用到 master 分支上,这样我们可以做一个合并的操作。用的是 git merge 命令。

先切换到 master 这个分支上 ... 可以用一个 git branch 查看一下 ... 如果在其它的分支上,再用 git checkout 切换到 master 这个分支上来 .. .

git checkout master

然后输入 git merge ... 后面加上要合并的分支的名称 ... mobile-feature ...

git merge mobile-feature

(项目实时预览)回车 ... 这里会显示 Fast-forward ,说明这是一个 Fast-forward 合并。到目前为止,我们在创建 mobile-feature 以后,还没有对 master 做新的提交 ... 所以, 这个合并就是一个 Fast forward 合并 ... 也就是,会直接把在 mobile-feature 分支上做的提交合并到 master 这个分支上来 ...

这个合并的动作不会是一个新的提交 ... 我们可以查看一下日志 ...

git log --oneline --decorate

当前我们是在 master 这个分支上,显示最后一次提交是 添加移动设备快捷图标 ... 这个提交我们是在 mobile-feature 这个分支上做的 ... 因为刚才已经把这个分支合并到了 master 上面 ... 所以,最后一次提交也就是在 mobile-feature 这个分支上的最后一次提交。

再去对比一下这两个分支的区别 ...

git diff master..mobile-feature

没有任何的提示 ... 因为我们已经把在 mobile-feature 提交的修改合并到了 master 分支上 ... 所以合并以后,这两个分支已经没有区别了。

03-05) 合并分支
 

在创建 mobile-feature 分支以后,我们没有对 master 做新的提交 ... 所以合并的时候,是一个 fast-forward 合并 ... 如果说对 mobile-feature 分支做的新的提交,同时,我们又切换到 master 分支,去做了几次新的提交 ... master 这个分支跟在创建 mobile-feature 分支的时候已经不一样了 ..

这个时候再去合并 ... 就是一个真正的合并了 .. 这种合并有时可能会遇到冲突,我们需要先解决这些冲突,然后再去做合并。下面,我们来看一下这种合并 ...

切换到 mobile-feature 分支 ... 再去做一点修改 ... 添加一行 web app 的 meta 标签 ...

git checkout mobile-feature

<meta name="apple-mobile-web-app-capable" content="yes">

保存 .. 回到终端 ... 再去提交一下这个修改 .. 这里我们用一个快捷方式 ... 可以直接使用 git commit ,加上一个 a 参数 ... 这样就不需要先去使用 git add 添加修改了... git commit -a ... 后面还要再加上 m 参数 ... 指定一个描述信息 ...

git commit -am '为 index.html 添加 webapp meta 标签'

git log --oneline 查看一下日志..

再切换到 master 这个分支上 ...

git checkout master

然后项目下面去新建一个文本文件 ... 命名为 humans.txt ... 在这个文本文件里,可以说明下你的项目,比如项目的团队成员,感谢... 使用的技术等等 ... 回到终端 ... git status 查看一下状态..

git status

然后再去提交一下 ...

git add .

git commit -m '添加了 humans.txt'

查看一下所有分支的所有的提交 ... 在后面可以指定一下显示的日志的数量 .. 最后可以再加上一个 graph 选项 ..

git log --oneline --decorate --all -10 --graph

你会看到,在 mobile-feature 这个分支上做了一个提交 ... 同时,我们也对 master 这个分支做了提交 .. 这个时候,我们去合并分支的话,就不能做 fast-forward 合并了。需要去做一个新的合并提交 ...

git branch ,看一下当前所在的分支 ...

git merge mobile-feature

回车以后,会出现一个提示,让我们输入一点这个合并提交的描述 ... 默认是 Merge branch 'mobile-feature' .. 合并 mobile-feature 这个分支,你可以修改这个描述信息... 不想改的话,直接保存退出就行了。这里 # 号开头的是注释的内容,可以不用管 ...

再查看一下日志...

git log --oneline --decorate --all -10 --graph

在这里,你会看到这个新的合并的提交 .. 打开项目的 index.html 看一下 ... 当前我们是在 master 这个分支上 .. 这里也会有在 mobile-feature 分支上添加的 webapp 这行 meta 标签 ...

因为我们已经把这个分支合并到了 master 分支上了。

03-06)解决合并冲突
 

在合并分支的时候,有可能会遇到冲突,我们需要先解决掉冲突,然后才能去合并分支 ... 下面,我们演示一下手工解决冲突的方法 ...

先切换到 master 分支 .. . 然后打开项目的 index.html ... 修改一下这个页面标题 ... 把 Document 改成项目的名称 ... Movietalk .. 保存一下 ...

回到终端工具,去提交一下这个修改 ...

git commit -am '修改 index.html 页面标题为 Movietalk'

然后切换到 mobile-feature 这个分支 ...

git checkout mobile-feature

打开项目的 index.html ,同样去修改一下页面标题 ... 改成 Movie 下划线 talk ... 保存 ...

再去提交一下 ...

git commit -am '修改 index.html 页面标题为 Movie_talk'

查看一下日志 ...

git log --oneline --decorate --all -10 --graph

下面我们可以试着把 master 这个分支合并到 mobile-feature 这个分支上 ...

git merge master

回车以后... 会出现冲突的提示 ... CONFLICT ... Merge conflict in index.html ... 在 index.html 这个文件里有合并的冲突 ...

这是因为我们在 master 还有 mobile-feature 这两个分支上都修改了 index.html 这个文件的页面标题 ... 所以在合并的时候,git 不知道你想要哪个修改 ...

想要放弃这个合并,可以使用 git merge ,后面加上一个 abort 选项 ...

下面我们可以手工去解决一下这个冲突 ...

打开项目的 index.html ...

在这个文件上面,git 已经给我们标记出了有冲突的地方 ... HEAD 和等号之间的内容当前分支上的 ... 也就是 mobile-feature 这个分支上的内容 ...

等号跟 master 之间的内容是 master 这个分支上的内容 ... 解决这个冲突,就是删掉不想要的内容 ... 比如我们想使用 master 分支上的版本 ...

这样,可以把 HEAD 和等号之间的东西删除掉 ... 包括 HEAD 还有等号这两行代码 ... 另外还有 master 这行代码 ...

保存 ... 然后需要再做一个提交 ...

git add .
git commit

这里可以不用为 commit 指定一个描述信息 ... 回车以后 ... git 会自动提交一条描述 ...

Merge branch 'master' into mobile-feature

我们可以把下面的 Conflicts: index.html 这行去掉 ...

保存并退出 ... 这样就完成了这个合并 ...

03-07)重命名与删除分支
 

重命名分支,可以在 git branch 后面加上一个小写的 m 参数,m 表示 move,移动的意思。我们先去新建一个分支 ...

git branch bugfix

查看一下所有的分支 ... 或者可以直接使用 git branch ... 不加任何的参数 ...

git branch --list

下面去重命名一下 bugfix 这个分支 ... git branch 加上一个小写的 m 参数 .. 然后是要重命名的分支 ... bugfix ... 一个空格,接着是这个分支的新名字 ... bugfix-1

git branch -m bugfix bugfix-1

再查看一下分支列表 ...

git branch --list

现在,bugfix 就被重命名为了 bugfix-1 ... 如果不再需要这个分支了,可以删除掉它,同样使用 git branch 命令,配合一个小写的 d 参数 ... git branch -d ... 后面加上要删除的分支的名称 bugfix-1 ...

git branch -d bugfix-1

回车 ... 提示,已经删除掉了 bugfix-1 这个分支 ...

04-01) 保存,恢复,删除工作进度 - stash
 

stash 可以把修改暂时保存在一个地方,你可以稍后再把它拿出来继续使用 ... 先去修改一下项目的 humans.txt ...

回到终端 ... 查看一下状态 ...

git status

提示有一处修改,humans.txt .... 这个时候,你想修改其它的东西,但是不想跟这个 humans.txt 修改一起提交。你可以用 stash 保存一下现在的工作进度 ...

git stash ... 后面再加上一个 save 参数,可以添加一条描述信息 ...

git stash save '修改了 humans.txt'

注意执行了这条命令以后,humans.txt 这个文件又恢复成了之前的样子 ... 因为我们把这个修改进度保存起来了 ...

再查看一下状态...

git status

提示当前工作目录是干净的 ... 你可以继续去做新的提交 ... 需要的时候,可以把保存的工作进度恢复过来 ...

查看

查看保存的工作进度,可以在 git stash 后面加上一个 list 选项 ...

git stash list

会给我们显示出保存的工作进度列表 ... 前面这个 stash@大括号,里面是一个数字,使用这个东西可以引用这个保存的工作进度 ..

比如想要对比一下这个工作进度跟现在的工作目录的区别 .. 可以使用 git stash show ... 加上一个 p 参数 ... 表示用补丁的方式查看 ... 最后是代表工作进度的代码 ...

git stash show -p stash@{0}

恢复工作进度

恢复这个工作进度,用的是 git stash apply ... 后面同样加上表示这个工作进度的代号...

git stash apply stash@{0}

这样会把保存的这个工作进度恢复过来 ... 我们可以继续修改,然后再去提交一下 ....

删除工作进度

不想再用这个工作进度,可以把它删除掉,git stash ... 后面加上一个 drop ,然后是工作进度的代号 ...

git stash drop stash@{0}

再查看一下

git stash list

刚才保存的这个工作进度已经被删除掉了。另外,在恢复工作进度的时候,我们可以直接删除掉这个工作进度,可以使用 git stash ,加上 pop .. 然后是工作进度代号 ...


04-02) 查看提交的日志 - git log

 

查看提交的日志,用的是 git log ...

git log

默认会显示全部的详细的提交日志,提交的 ID,作者,日期,还有提交的描述。按下 f 键可以向下翻页,b 键可以向上翻页 ... q 可以退出显示。

加上 --oneline 选项,可以显示一个简单的日志列表 ...

git log --oneline

这里只会显示一个简单提交ID,还有提交的描述。我们也可以控制输出的行数 ... 比如只想显示最近 5 条信息

git log --oneline -5

加上 author 选项,然后指定具体的作者,可以只显示这个指定作者的提交。比如查看 王皓 的所有的提交

git log --oneline --author='王皓'

使用 grep ,可以搜索一下提交日志,比如找出所有包含 index.html 这个字符的提交 ...

git log --oneline --grep='index.html'

也可以指定提交的日期 ... before 可以指定从哪个日期开始,之前的所有的提交 ... 在它后面可以指定具体的日期 ... 比如找出 2014-xx-xx 这个日期还有在它以前的做所有的提交...

git log --oneline --before='2014-xx-xx'

我们也可以使用描述类型的日期形式... 比如 1 day ,2 days ,1 week 等等,找出一天前的提交 ...

git log --oneline --before='1 day'

找到指定日期开始之后的提交,用的是 after .. 比如找出最近1星期的所有的提交 ...

git log --oneline --after='1 week'

加点图形效果,可以使用 graph

git log --oneline --graph

git log 有很多选项,你可以使用 git help log ,去查看一下详细的使用手册。

04-03) 别名 alias
 

我们可以给经常使用 git 命令,去添加一个别名,这样可以简化一下我们经常输入的 git 命令。

设置别名,用的是 git config ... 然后指定一下别名应用的范围,一般我们可以在用户级别,也就是全局范围内去设置别名。 --global ... 表示全局范围。然后是 alias ,加上一个点,接着是命令的别名 ... 比如设置一下 checkout 的别名,设置成 co ... 空格 ... 最后是要添加别名的命令 ... 这里就是 checkout ...

git config --global alias.co checkout

给这个 checkout 命令添加的别名的配置,会保存在用户主目录下面的 .gitconfig 这个文件里面 ... 我们可以查看一下这个文件 ...

cat ~/.gitconfig

你会看到一个 alias 区域,下面有一行 co 等于 checkout ,表示 checkout 这个命令的别名就是 co ...

[alias]
co = checkout

下面,我们可以试一下。比如要切换到 mobile-feature 这个分支上 ... 输入 git 然后加上 checkout 命令的别名 ... co ... 接着是分支的名称 ...

git co mobile-feature

.bash_profile

这种为 git 命令设置别名的方法是 git 提供的 .. 另外,我们也可以在系统上去设置命令的别名 ... 可以去编辑一下用户的 .bash_profile 文件 ...

vim ~/.bash_profile

然后输入 alias ... 空格,接着是要设置的命令的别名 ... 比如我们要设置一下 git checkout 这个命令的别名 ... 输入 gco ... 等于 ... 一组引号 .. 引号里面是要设置别名的命令 ... 'git checkout'

这样,我们在命令行里,直接输入 gco ,就相当于是输入了 git checkout ... 保存一下 ... 关掉终端工具,再打开以后,刚才设置的别名就会生效了 ... 或者,可以使用 source ,去更新一下 .bash_profile

source ~/.bash_profile

再试一下刚才设置的 gco 这个别名 ... 输入 gco ,这就相当于是输入了 git 空格,checkout ... 后面加上分支的名称 ... master

gco master

你可以使用这个方法,继续去给其它的命令添加别名。

04-04)忽略跟踪文件 - 全局范围
 

有时候在项目里的一些文件我们不想让 Git 去跟踪,这些文件可能是系统生成的临时文件,也可能是项目本身生成的一些临时文件,或者其它不想保留的文件。

我们可以告诉 Git ,忽略掉这些不想跟踪的文件。可以在全局范围里设置一些要忽略的文件,比如在 Mac 系统上,有时候会在目录里面生成 .DS_Store 的文件,因为文件名里面带一个点,所以默认它是隐藏的,这个文件会存储目录的显示属性,一般我们不希望让它出现在项目的版本库里面。

这样我们就可以在全局范围里面,让 Git 忽略掉这个文件。

我们要做的就是去创建一个文件,在文件里输入要忽略掉的文件的列表,再去执行一行命令,告诉 Git 在全局范围里要忽略掉的文件。

git config --global core.excludesfile ~/.gitignore_global

这行命令就是告诉 Git 全局范围内要忽略掉的文件列表在 .gitignore_global 这个文件里面。

下面我们可以去编辑一下这个文件 ..

vim ~/.gitignore_global

输入 .DS_Store ... 保存一下 ...

这样在全局范围内,也就是操作系统当前这个用户的下面,不管在哪个版本库里面,Git 都会忽略掉 .DS_Store 这个文件。

打开一个版本库 ...

在里面创建一个 .DS_Store 文件 ...

然后再查看一下状态 git status ...

显示目前工作目录是干净的,并没有显示刚才创建的没有跟踪的文件 ... 因为我们已经告诉 Git 忽略掉它了。

另外,还有一些可以在全局范围内忽略的文件,你可以参考这个地址。

https://gist.github.com/octocat/9257657


04-05)忽略跟踪文件 -  项目级别
 

我们可以为每个项目单独去创建一个要忽略掉的文件列表,方法是,在项目的根目录下面,去创建一个 .gitignore 的文件,在这个文件里,我们可以列出要忽略掉的文件。

下面,我们去创建一个这样的文件 ...

在项目的根目录下,去创建这个文件 ... 先进入到项目 ...

vim .gitignore

编辑一下 ...

比如我想忽略跟踪所有扩展名是 .log 的文件,一般就是一些日志文件 ...

可以输入一个星号,然后是扩展名, 星号表示做任意的字符 ..

*.log

另起一行,可为继续去配置这个忽略的文件列表。完成以后,保存一下 ...

然后再去提交一下。

git add .
git commit -m '添加了 .gitignore 文件'

下面,我们再试一下这个忽略规则有没有效果 ...

创建一个 .log 的文件 ...

touch access.log

查看一下状态 ...

git status

显示工作目录是干净的 ... 说明 Git 已经忽略掉了以 .log 为扩展名的文件。

要注意的是,Git 不会忽略掉已经被跟踪了的文件,如果你想忽略掉这些文件,可以使用 git rm 加上 cached 选项,再指定一下文件名称,这样可以取消跟踪指定的文件。

这样配置的忽略的规则才会生效。

模板

另外,很多项目都有一些特定的文件需要被忽略,比如 Ruby,WordPress,Drupal ... 你可以参考这个地址提供的 .gitignore 的模板,去为项目添加这个 .gitignore 文件。

https://github.com/github/gitignore

05-01)远程 Remote

我们可以为项目在远程的服务器上创建一个版本库,然后把在本地上的版本库推送到远程服务器上。这样做的好处是,如果你把本地的版本库整丢了,在远程的服务器上还有一个备份。

另外,你也可以跟其它人协作,共同去开发项目。协作者可以把你在远程服务器上的版本库,克隆一份,到自己的电脑上,他可以查看所有的,你所做的提交,也可以自己修改并且提交。

如果你允许的话,还可以让协作者把他自己亲自做的提交,推送到你在远程服务器的版本库上。然后你可以把协作者的提交 fetch 到本地,再把它们合并到项目的分支里面。

我们可以自己去搭建这样的版本库服务器,也可以使用一些现成的服务。在下面的视频里我们来看一下使用 github 提供的远程版本库服务 ...

05-02) Github - 创建并添加

在 Github 上可以免费去创建公开的版本库,也就是你推送上来的版本库其它人都能看得到。他们可以把你的版本库下载下来。可以 Fork ,也就是要以基于你的版本库创建自己的版本。

另外,Github 也可以让你创建私有的版本库,除了你指定的协作者以外,其它人不会看到你的版本库。创建私有版本库需要每月交一定的费用。

下面,我们在 Github 上创建一个免费的公开的版本库。

首先我们需要去申请一个 github 帐号,然后登录一下 ... 再去创建一个版本库。点击这个 + 号,选择 New repository ...

在这里输入一个版本库名称 ... 在本地上我们有一个叫 movietalk 的版本库,在这里,也可以叫它 movietalk ...

在 Description 这里可以输入一点关于这个版本库的描述 ... '宁皓网 Git 基础教程测试'

然后选择这个版本库是公开的,还是私有的,这里选择 Public 公开 ... 如果选择 Private 私有的话,你需要购买 github 的服务。

配置好以后,点击 Create repository ... 创建版本库 ...

创建好以后 github 给我们两个选项,Create a new repository on the command line 按照这个下面的步骤,可以在本地创建一个新的版本库,也就是如果你还没有启动开发项目,可以按照这个步骤去在本地创建一个空白的版本库,再为这个版本库添加一个远程,然后再把项目推送上来。

如果你想使用在本地上已有的版本库,可以按照 Push an existing repository from the command line 这个下面的步骤 ... 把在本地上已有的代码库直接推送到刚才创建的这个远程的代码库里面。

下面,我们可以本地上的 movietalk 推送上去 ... 我们先复制一下这个远程的代码库的地址 ...

添加远程

回到命令行 .. 我们用 git remote add ,去为项目添加一个远程 ... 后面是远程的名称 ... 通常情况下,我们会叫它 origin .. 这只是一个惯例,你完全可以按照自己的想法去命名这个远程。

在它的后面是远程代码库的地址 ...

git remote add origin https://github.com/wanghao8080/movietalk.git

查看远程,可以使用 git remote 命令

git remote

这里会显示出刚才添加的 origin ... 加上一个 v 选项,可以查看更详细的信息 ... v 表示 verbose ..

git remote -v

同样会显示出刚才添加的 remote ,一个是 fetch 远程,用来提取,一个是 push 远程,用来推送。默认这两个远程是同一个地址。如果想移除掉这个远程,可以使用 git remote rm ,然后加上要移除的远程的名字就行了。

05-03) 推送分支 - git push
 

有了这个远程版本库以后,我们可以使用 git push ,去把项目在本地版本库里的一个分支推送到远程的版本库里面 ...

git push ,这里可以再使用一个 -u 选项,它是 --set-upstream 的简写形式,意思是去跟踪远程分支的变化。 ... 然后是远程的名称,刚才我们添加了一个叫 origin 的远程 ... 这个远程指定的就是在 github 上创建的 movietalk 版本库。

最后是要推送的分支的名称 .. 我们可以先把 master 这个分支推送上去 ... 输入 master ...

git push -u origin master

提示要输入我们在 github.com 上的用户名 ...

再输入密码 ... 回车 ...

git 会做一些工作,统计对象的数量,压缩,然后上传 ... 因为我们这是第一次 push master 这个分支 ....

最后提示 Branch master set up to track remote branch master form origin ...

意思就是,master 这个分支会跟踪 origin 上的 master 分支。我们先回到 github 上去看一下 ... 打开刚才创建的 movietalk 这个版本库...

这里会显示刚才推送上来的东西 ... 也就是项目的 master 这个分支 ... 这里不仅仅包含项目的代码和文件... 还包含我们在 master 分支上做的所有的提交 (点击打开 commits )...

再打开 branch ,分支看一下 ... 这里只会显示一个 master 分支 .. 一会儿,我们可以再把 mobile-feature 这个分支也推送上来 ...

再回到命令行看一下 ...

查看本地分支用的是 git branch ,加上一个 a 参数,(git branch -a)可以显示所有的分支 ... 如果只想查看远程分支,可以使用 git branch ,后面加上一个 r 参数 ... 表示查看 remote 分支 ...

git branch -r

你会看到 origin/master 这个分支,这个分支跟普通的分支没有啥区别,不过你不能切换到这个分支 ... 因为 git 会使用这个分支跟踪远程版本库上的分支。在后面的视频里,我们会通过一些演示,理解一下这个跟踪是怎么一回事。

下面,我们可以再把 mobile-feature 这个分支也推送到 origin 上去,也就是在 github 上的版本库里面。git push origin ,要推送的分支是 mobile-feature ... 这次我们没有使用 u 参数,这样 mobile-feature 这个分支就不会跟踪远程的 mobile-feature 分支的变化。

git push origin mobile-feature

完成以后,再打开 github ....

点开 branch ... 在这里,除了 master 这个分支以外,还会看到刚才推送上来的 mobile-feature 这个分支。

05-04)  其它人如何使用远程版本库
 

我们把 movietalk 这个项目推送到了远程服务器上,也就是 github 提供的远程版本库里面。因为这个版本库是公开的,所以任何人都可以看到这个版本库的内容。如果他们只对项目的代码感兴趣,可以点击版本库页面右边栏上的 Download ...

这样可以把项目的代码和文件下载到自己的设备上...

如果他们需要项目的版本库 ... 可以使用 git clone ,去把这个代码库克隆一份到自己的设备上,这样可以查看项目的提交,可以继续从远程版本里提取新的提交,然后合并到在本地的版本库上面。

如果他们想基于这个项目,去开发自己的版本,可以 Fork 到自己的帐户下载,再克隆到本地,继续去开发,然后再推送到自己的远程版本库里面。如果他觉得我们也可能需要他提交的东西,可以去申请一个 pull request ,提交以后,我们可以查看 pull request 的东西,如果觉得合适,可以把这个 pull request 合并到我们自己的项目里面。

或者,也可以成为这个项目的贡献者,共同去开发,这需要我们先到项目的设置界面上,去添加指定的贡献者,这样被添加的贡献者就拥有了写入版本库的权限,也就是他们也可以使用 push ,把自己的提交推送到我们的远程版本库里面。

在下面的视频里,我们可以去请出几个临时演员,模拟一下这几种情况。

05-05) 克隆
 

首先出场的是张三,他觉得我们的项目挺不错,并且打算经常提取我们新 push 上去的提交。这种情况,张三可以使用 git clone ,把我们的版本库,克隆一份到自己的设备上。

打开项目的页面,在右边栏上,可以找到项目的远程版本库的地址 ... 复制一下 ...

然后张三打开了自己的命令行工具 ... 这里还是用我自己的电脑当成道具吧,先回到桌面上 ..

输入 git clone ... 后面加上远程版本库的地址 ... 注意,如果执行现在的命令,会在桌面上创建一个跟版本库同名的目录,也就是这个 movietalk ... 想自己去定义这个目录名称的话,可以在后面再加上一个目录的名称 ...

git clone xxxx movietalk_zhang

回车 ... 这样会把克隆以后的版本库放在 movietalk_zhang 这个目录的下面。

继续提交并推送

这个时候,我们可以又修改了项目,并且把提交又推送到了远程版本库上面。先把身份从张三再切换地来 ... 我们去修改一下项目 ...

可以再打开一个新的命令行窗口 .. command + t

进入到项目... movietalk ... 修改一个地方 ... 比如改一下 humans.txt ... (添加一个人名)

再提交一下 ...

git commit -am '修改了 humans.txt'

然后把这个提交,再推送到远程版本库上去 ...

git push origin master

这个时候,我们在远程的版本库里面,也会包含刚才的提交 ... 但是,张三并不知道这个新的提交 ... 他需要做一个 fetch ,提取的动作 ...

在下面的视频里,我们再看一下怎么样使用 git fetch ...

05-06) 提取 - git fetch
 

现在我们的角色又变成张三了,先进入到张三在本地设备上的代码库... cd movietalk_zhang ... 然后用一个 git status 查看一下状态 ...

提示当前是在 master 这个分支上,并且 Your branch is up-to-date with 'origin/master'. 意思是当前我们的分支跟远程分支 origin/master 是一致的 ... 表示远程分支上没有发现更新 ...

但是刚才我们已经推送了新的提交到远程版本库上 ... 想要获取这个更新,张三需要使用 git fetch ,去提取一下 ... 提取的更新会放在 origin/master 这个分支上 ... 然后我们可以再把这个分支合并到 master 分支上。 这样,张三的 master 分支,也会包含我们刚才提交的更新。

输入 git fetch ...

提示说,已经从远程版本库上的 master 分支提取了更新,并且把更新的东西放在了在本地上的 origin/master 这个分支上 ...

再去查看一下状态 ... git status

提示远程分支上有更新 ...

这个时候,张三可以使用 git merge ,去合并一下 ...

git merge origin/master

然后再去查看一下状态 ... git status ...

现在,又会提示 Your branch is up-to-date with 'origin/master'.

当前分支与 origin/master 保存一致了。

05-07) Fork

下面我们请出李四,演示一下使用 Fork 和 Pull request 。李四觉得我们的项目也挺不错,不过他想基于我们的项目去开发他自己的版本。这个时候,李四可以先把项目 Fork 到自己帐户下面。

李四打开我们的项目页面以点,点击 Fork ... 这样会直接把项目版本库复制一份到李四的帐户下面。

然后李四可以再把在他帐户下面的 movietalk 这个版本库,克隆到本地设备上,去继续开发 ...

找到版本库的地址 ... 复制一下 ... 回到命令行 .. 先回到桌面上 ...

git clone xxx movietalk_li

这样会把在李四帐户下面的 movietalk 版本库克隆到桌面上的 movietalk_li 这个目录的下面 ...

进入到这个项目 ...

修改配置

因为我们是在同一个设备上做的演示,并且之前我们配置了 git 在全局范围的设置,所以默认情况下,提交都是以王皓的身份去做的 ... 为了演示一下,我们可以配置一下项目级别的配置,也就是去单独为 movietalk_li 这个版本库去配置 ..

git config user.name '李四'
git config user.email 'lisi@ninghao.net'

这样在 movietalk_li 这个版本库里的提交,就会使用李四的身份了。

继续开发

李四继续去开发这个项目 .. 比如,李四要给项目添加一个 README.md ,md 表示 markdown ,是一种标记的语言,github 会自动去在项目根目录下去找这个文件,然后把它转换成 HTML 格式,显示在项目页面的下面。

README.md 里的内容一般是关于项目的介绍,还有使用说明 ...

vim README.md

输入点内容 ... 两个 # 号表示后面的文字使用二级段落标题 ...

* 号,可以转换成无序列表 ...

保存一下 ... 然后去提交这个修改 ...

git add .
git commit -m '添加了 README.md 文件'

下面,李四要把这个提交推送到他自己的远程版本库上去 ... 这里我们可以先清空一下保存的 github 的登录信息。这样在推送的时候,可以使用李四在 github 上的帐户。

Mac 用户可以打开 Keychain ... 搜索一下 github ... 然后删除这两个选项 ...

再回到命令行 ..

git push origin master

输入李四在 github 上面的用户名 ... 再输入密码 ...

完成以后,会把李四新做的提交推送到他的远程版本库里面 ...

打开李四的远程版本库 ....

你会看到,最后一次更新是来自他自己 ....

05-08) Full Request

李四觉得他给项目添加的 README.md ,在我们的项目里也可能会用到。因为李四并不是我们项目的贡献者,所以他不能直接把提交 Push 到我们的项目里面。这个时候,李四可以做一个 Pull request ...

我们收到这个 Pull Request 以后,如果觉得合适,可以把这个 Pull request 合并到项目里面。

下面李四要去做一个 Pull Request ,打开他自己的远程版本库以后,点击右边栏上的 Pull Requests

点击 New pull request ,去新建一个 Pull Request

在这里,李四可以选择要比对的版本库,还有分支 ... 默认就是来自 wanghao8080 这个用户的 movietalk 这个版本库的 master 这个分支,还有 lisi8080 的 movietalk 这个版本库的 master 分支 ...

点击 Edit ,可以去编辑一下 ...

在下面,会给出这两个分支的区别。我们可以基于这个区别,去创建一个 Pull Request ,点击 Create Pull Request ..

可以设置一下这个请求的标题,还有一小段评论 ...

确认以后,点击 Send pull request ..

(回到wanghao8080)这个时候,如果我再打开项目的页面,会收到李四发过来的这个 Pull Request ... 点击 Pull Requests

会显示所有发过来的 Pull Request 。打开李四发过来的这个。

点击 Commits ,可以查看这个 Pull Request 里面包含的提交。打开 Files changed 这个选项卡,可以查看发生变化的文件。

如果,我们要接受这个 Pull Request 。

可以点击 Merge pull request ... 把这个请求里包含的提交,合并到我们的版本库里面。再点一下 Confirm merge ,确认一下这次合并。

合并以后,会做一次 commit 。

再打开我们的项目页面。你会看到最新的提交,是刚发合并李四发过来的 Pull Request 的提交。

05-09)为项目添加协作者共同开发
 

最后出场的是小雪,她想跟我们一起开发 movietalk 这个项目。我们可以先把她加入到项目的贡献者列表里,这样她就跟我们一样,可以对项目修改,提交,然后 push 到远程的版本库里面。

我们可以 fetch 小雪的提交,然后合并到自己在本地分支上。 先去把她添加到项目的贡献者列表里 ...

打开项目在 github 上的页面。https://github.com/wanghao8080/movietalk

点击边栏上的 Settings ,打开项目的设置页面。 Collaborators .. 提示我们需要再输入一次帐号的密码 ...

在这里,可以搜索一下想要加入到这个项目的协作者 ... 找一下 xiaoxue8080,这是小雪在 github 上的用户名 ...

Add collaborator 添加贡献者 ...

现在, xiaoxue8080 这个用户,就拥有了写入这个项目的权限。她会收到一封通知的邮件。提示她,我们已经把她加入到 movietalk 这个项目的贡献者列表里了。

打开一个用小雪身份登录到 github 上的浏览器。

小雪想要跟我们一起开发,她需要先去克隆一份版本库到本地设备上 ... 找到远程版本库的地址。

回到命令行 ... 在桌面上,去创建这个克隆的版本 ...

git clone xxxx movietalk_xiao

克隆以后的版本库会放在这个 movietalk_xiao 目录的下面。进入到这个目录 ...

如果小雪用的是自己的电脑,可能已经在全局范围里面配置了 Git,她的名字,还有 Email 地址。这里我们为了演示,可以在这个项目级别里面,去配置一下。

git config user.name '小雪'
git config user.email 'xiaoxue@ninghao.net'

然后小雪可以继续去开发这个项目 ... 比如再去修改一下 README.md 这个文件 ...

再去提交一下这个修改 ...

git commit -am '修改了 README.md,添加了 ... '

完成以后,小雪可以把这个提交推送到远程版本库上去 ... 这里我们还是需要先去请空一下保存的 github 密码 ... 打开 keychain ... 搜索 github ... 选中 ... 然后删除 ...

回到命令行 ... 使用 git push ,去推送一下 ... 不过在推送之前,小雪可以先去提取一下 ... 看看远程版本库有没有更新 ...

git fetch

没有更新 ... 再去执行 git push ...

git push origin master

再回到项目在 github 上的页面 ... 你会看到,最新的一个提交来自小雪 ...

06-01) 图形工具 - github

 

Git 有一些图形化的工具,我们也可以试一下。比如 Github 就提供了一个这样工具。你可以在 Windows 系统或者 Mac 系统上去使用它。

下面,我们在 Mac 系统下面去演示一下。

打开 github 这个软件以后,可以先用 github 帐户登录一下 ... 打开偏好设置 ..

Login ,输入用户名 ... 再输入密码 ...

然后点击 Sign in

登录成功以后,点击个人帐户 ... 在这里,会显示我们在 github 上面的版本库 ... 点击 Clone to Computer ,可以把这个版本库克隆到自己的电脑上。

或者,打开 My Repositories ,可以查看我们在本地上的版本库 ...

目前这里还没有 ... 点击 文件 菜单,可以在本地新建一个版本库,或者去添加一个已有的本地的版本库 ..

这里我们选择 Add Local Repository ,去添加一个本地的版本库 ...

选择在桌面上的 movietalk 这个版本库 ..

会把它添加进来,打开这个版本库,History 历史,就是我们做的 commit 提交 ... 点击选择一个提交,可以查看这个提交的修改 ..

再打开 Settings ,设置选项卡 ... 在这个界面上,我们可以配置一下远程版本库的地址 ... 还可以去修改要忽略的文件列表。

Branches ... 在这里可以查看版本库里面的所有的分支 ... 点击分支,可以切换到这个分支

再看一下 Changes ... 在这里,会显示还没有提交的修改 ...

打开项目 ... 修改一下 ...

再回到 github 工具 ... 在这儿会显示我们刚才做的修改 ...

这里,可以直接提交这个修改 ... 先输入一个提交信息 ... 然后点击 Commit

这样就完成了在本地的提交 ... 在 Unsynced Commits ,未同步的提交这里,会出现刚才的提交。

点击 Sync,我们可以把这个提交 Push 到远程的版本库上去。

06-02) 图形工具 -  brackets Git
 

打开 Brackets 编辑器 ... 文件,扩展管理器... 或者直接点击界面右边的 扩展 小图标 ... 打开以后搜索一下 Git ...

这里我们可以安装一下 Brackets Git 这个扩展 ...

完成以后,可以用 Brackets 打开项目的目录 ... 先打开项目里的一个文件 ... 然后点击目录旁边的这个下拉菜单,可以选择版本库的分支 ...

默认是 master,因为我们还创建了一个 mobile-feature 分支,所以在这里会显示出这个分支 ...

我们也可以选择去新建一个分支 ...

再点击边栏上的这个 Git 小图标 ... 在界面底部会显示一个边栏。

打开这个秒表样式的小图标,会显示出我们在项目当前这个分支上做的所有的提交。点击某个提交以后,会显示在这个提交上所做的修改。

如果我们只想显示当前打开的这个文档相关的提交 .... 可以点开这个文件样式的图标。

下面我们再修改一下这个文件...

保存一下,会显示刚才的修改 ... 选中这个提交 ... 然后点击 提交 按钮 ...

会打开一个提交的窗口,上面会显示所做的修改 ... 在这里,再添加一条提交信息 ...

然后 确认 ... 这样就完成了这个提交。

远程

在这个底部窗口的工具栏上,还有几个按钮跟远程服务器有关... 点开这个菜单 ... 可以选择 远程 ... 或者去添加新的远程 ..

它的右边这个按钮,可以从远程上去提取更新 ...

这里还有一个可以把提交 Push 到远程的按钮 ... 点开以后 ... 会有一些选项 ...

我们可以选择要推送到的分支 ...

在下面,需要再去输入我们在登录到远程版本库要用到的用户名还有密码。

完成以后,点击 OK ,可以把刚才的提交,推送到远程版本库上去。



来自 https://ninghao.net/course/1882

a) git status   



a) git status  


a) git status  

a) git status  


a) git status  

a) git status  

a) git status  

a) git status  


普通分类: