git

Git安装

1、安装brew   https://brew.sh/ 后在安装

2、brew install git

3、git --version   查看git版本

4、which git       显示当前git所在的目录

版本控制

版本控制分为 集成式版本控制 和 分布式开发

    1、集成式开发(svn):需要一台中央服务器,客户端需要连接到中央服务器进行更新、提交代码文件等

    2、分布式开发(Git):每台机器都有自己版本库不需要中央服务器

分布式的好处:

    1、不需要连接中央服务器来提交和更新文件

    2、通过不同的版本来做不同阶段开发,不同的版本文件可以随时切换回之前的版本

    3、分支管理上要比svn方便很多


[master +0 ~0 -0 !1]: + 增加  ~修改  -删除  !有冲突

Git的配置文件:vi ~/.gitconfig

常用命令

1、将远端的库克隆到本地:  git clone 远程代码库

2、切换到一个分支: git checkout 分支名

3、如果分支存在只切换分支,如果不存在则创建并切换到分支:  git checkout -b   新建本地分支名  origin/远端分支名

4、查看当前所在的分支:  git branch

    创建新分支: git branch 新分支名

5、将文件添加到暂存区:  git add 文件名         git add .  添加所有工作区文件到暂存区

6、提交文件:  git commit -m '提交版本内容说明'

7、将本地代码提交到远端库:  git push origin/develop_web  本地分支名

8、查看当前文件状态:  git status 

9、从远端拉取拉取代码:  git pull 远端分支名

10、临时保存:  git stash   git stash pop

11、从主分支上merge代码:  git merge origin/dev_crm2.6_base

12、将本地分支提交到主分支:  pull resquest

13、删除本地分支:  git branch -d dev_crm2.8_base

14、删除远端分支:  git push origin :PublicAdmin_V1.0.0_liusiguang        或  git branch -r -d origin/PublicAdmin_V1.0.0_liusiguang

15、从远端单独拉取一个文件:  git checkout origin/master -- path/to/file

16、撤消最后一次commit提交:git reset --hard HEAD^

17、chenkout一个分支后,pull的时候想在app_master下切换,使用下面命令进行转换

    git branch --set-upstream 当前分支名 远端分支名

18、git branch --track branch 名称 远端branch 建立一个 tracking 远端 branch 的 branch,这样以后 push/pull都会直接对应到该远端的branch。
    git branch --set-upstream branch 远端branch 将一个已存在的 branch 设定成 tracking 远端的branch。

19、git branch -m oldName newName   修改分支名

版本库介绍

工作区(文件)      暂存区(过度)     版本库      |       远端(服务器版本)    

1、工作区:  开发的区域

2、暂存区: 将工作区的文件执行 git add '文件名' 命令会使文件添加到暂存区,工作区的文件如果删除了就没有了

    git add '文件名'


3、版本库: 通过commit来提交到版本库, 暂存区需要先提交到版本库才能最后提交远端

    git commit -m '提交说明内容'

    add 和 commit 连着的写法
    git commit -a -m '提交注释'        // 这样可以省略add的步骤


4、提交到远端: 通过push来提交到远端

    git push origin develop_web_2.5.1_siguang            // 提交到远端

初始化配置

1、设置贡献者

    设置用户名:     git config  --global user.name “username”

    设置Email-id:  git config  --global user.email “email”


2、设置避免PULLING提交合并:   git config --global branch.autosetuprebase always

3、颜色高亮

    git config --global color.ui true

    git config --global color.status auto

    git config --global color.branch auto


4、设置默认编辑器:  git config --global core.editor vim        Git的使用系统默认取自VISUAL或EDITOR环境变量的编辑器

5、设置默认的合并工具:  git config --global merge.tool vimdiff

6、查看设置命令:  git config --list

创建版本库

1、git init 库名: 创建一个git仓库 

2、git remote add origin git@xbc.me:wordpress.git:    添加远程版本库origin

3、git remote:   显示所有远端主机

    git remote  -v:        查看远程仓库地址

    git remote show <主机名>:     查看远端主机的详细信息

    git remote add <主机名> <网址>:    添加远程主机

    git remote rm <主机名>:    删除远端主机

    git remote rename <原主机名> <新主机名>:    对无端主机进行改名

     在clone完成之后,Git 会自动为你将此远程仓库命名为origin,origin只相当于一个别名,运行git remote –v可以看到下载的版本路径。


克隆项目地址:    git clone 远程版本库地址

文件操作(查看、添加、提交、删除、恢复,撤消)

查看:

    1、git help:  显示help的命令功能

    2、git show 提交ID:  显示某次提交的内容,先通过git log来查看提交的ID

        commit 1bf1682120ac9fa622b04a77781f5999e0aabd9e         // 提交的ID

    3、git log:  显示所有的版本记录


添加: 添加到缓存区

    1、git add 文件名:  将工作文件修改提交到本地暂存区            add只是刷新了git的跟踪信息,并未发到版本库中

    2、git add --all:  将所有修改过的文件提交到暂存区


提交: 提交到版本库

    1、git commit -m '注释提交理由':  代码提交

        git commit --amend:  使用最后一次提交的注释在提交

    2、git push origin master:  将刚commit的版本推送到远程服务器


删除:

    1、git rm 'main.js':     删除暂存区的main.js文件

    2、git rm -f 'main.js':  删除工作区和暂存区的main.js文件

    3、git rm --cached 'main.js':  如果工作区和暂存区都有main.js,只删除暂存区文件


恢复:

    如果把工作区的文件删除了,想从版本库中恢复回来的方法:

    1、恢复文件

        先 git log 来查看commit 提交的历史版本,获取到commitId

        commit d5d9357319a4ef536b30f2d906bb71700beaa899
        Author: liusiugang <liusiguang@renrendai.com>
        Date:   Thu Nov 3 15:19:00 2016 +0800

            修改邻趣配送时间接口加merchantId参数+

        git checkout  [commitId] [要恢复的文件名]

        // 这样就将版本库中的common.coffee.js恢复到了工作区
        git checkout d5d9357319a4ef536b30f2d906bb71700beaa899  common.coffee.js   


    2、恢复版本

        1)git reset --hard  [commitId]    恢复到指定提交的版本的内容,通过commitId来指定版本

        2)git reset --hard HEAD^    恢复向后一个版本

        3)git reflog    显示所有的操作记录


撤消:

    1、git reset <file>:    从暂存区恢复到工作文件

    2、git reset --:        从暂存区恢复到工作文件

    3、git reset --hard:    恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改

    4、git reset HEAD b:    现在你只想提交a文件,不想提交b文件,应该这样

    5、git revert <$id>:    恢复某次提交的状态,恢复动作本身也创建了一次提交对象

    6、git revert HEAD:    恢复最后一次提交的状态

        git checkout -- filname  撤回远端版本或指定文件

        git commit --amend    重新合并一个提交方案


文件重命名:

    1、git mv reademe.txt 新文件名


查看当前库状态: git status

    显示
    On branch master        // master分支
    Your branch is up-to-date with 'origin/master'.        // 你的分支是最新的 master
    nothing to commit, working directory clean            // 无提交,工作目录干净

分支

1、查看分支

    查看本地分支:  git branch

    查看远端分支:  git branch -r

    查看本地和远端分支:  git branch -a

    查看各分支最后提交的信息:  git branch -v

2、创建分支 

    git branch 分支名称

3、把分支提交到远端分支

    # 如果在本地创建一个分支,与团队其它人一起开发,需要将这个分支push到远端仓库,不然这个分支只是存在你本地,其它人看不到,每次commit完代码就需要提交到远端

    git push origin 本地分支名

    Example:

        appledeMacBook-Pro:what apple$ git push origin dev_1.1_lulu           // 将dev_1.1_lulu分支提交到远端
        Username for 'https://github.com': siguang1983            // 输入远程的用户名
        Password for 'https://siguang1983@github.com':             // 输入远端的密码
        Counting objects: 4, done.                                // 成功

4、删除分支: 

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

    git branch -D <branch>        强制删除某个分支 (未被合并的分支被删除的时候需要强制)

5、切换分支:

    git checkout [要切换的分支]        本地切换分支

    git checkout -b [新创建分支名]  [远端地址分支]            创建并且直接切换到这个新分支

6、合并分支: git morge  分支名

    git merge master develop        # 将develop分支合并到master上

7、分支的更新与合并

    # 将本地仓库更新到最新版本,直接更新自动合并冲突,如果执行fetch提示哪些冲突需要手动更新
    git pull origin 分支名

    # 执行一下合并,并且手动去去解决冲突
    git merge [branch]

    # 将这个冲突文件重新提交 
    git add <filename>

    # 查看一下冲突的文件
    git diff 确定分支  目标分支

    # 冲突处理完后就可以commit
    git commit -m 'fix conflict'

8、删除远程版本:  git push origin :br-1.0.0

9、查看分支提交的记录:  git whatchanged

    commit 1bf1682120ac9fa622b04a77781f5999e0aabd9e            // 提交的状态码
    Author: apple <apple@appledeMacBook-Pro.local>            // 提交人
    Date:   Mon May 2 17:24:16 2016 +0800                    // 日期

        siguang add index.js                // 提交文件

    :100644 100644 e69de29... 50b777e... M  js/index.js

拉取远端代码 和 提交远端代码

1、pull、fetch 两种都是拉取代码功能,有一些小的差别

    git pull : 拉取远端代码,直接合并        // Already up-to-date. 已更新

    git fetch: 拉取远端代码,并不合并,查看哪些冲突,来进行手动merge合并


2、版本库提交到远端

    git push origin/dev_crm2.9_base


3、pull request:将代码提交到远端版本中的一个请求,在merge就可以直接合到远端仓库中

解决冲突

拉取完代码git pull 或 git fetch 拉取远程某个分支的代码,再与本地的指定分支合并(包括fetch和merge)

git pull origin/dev_crm2.5_base 

git merge origin/dev_crm2.5_base

    有时候pull的时候会提示:git branch --set-upstream master origin/next  

    Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)

    如果有冲突 常见提示:
        Auto-merging addCacke.html            // 自动合并了这个文件
        CONFLICT (content): Merge conflict in addCacke.html            // 有冲突在 addCacke.html文件中合并冲突
        Automatic merge failed; fix conflicts and then commit the result.        // 自动合并失败解决冲突

查看文件之间区别 diff

1、git diff <file>:        是工作区与暂存区的

2、git diff <$id1> <$id2>:    比较两次提交之间的差异

3、git diff <branch1>..<branch2>:    在两个分支之间比较

4、git diff --staged:    比较暂存区和版本库差异

5、git diff --cached:    暂存区和版本区差异

6、git diff --stat:         仅仅比较统计信息

查看提交记录

1、git log:  显示提交的所有记录

    commit 1bf1682120ac9fa622b04a77781f5999e0aabd9e         // 提交的ID
    Author: apple <apple@appledeMacBook-Pro.local>         // 提交用户
    Date:   Mon May 2 17:24:16 2016 +0800                 // 提交日期

        siguang add index.js            // 提交文件

2、git log <file>:        查看该文件每次提交记录

3、git log -p <file> :    查看每次详细修改内容的diff

4、git log -p -2:        查看最近两次详细修改内容的diff

5、git log --status:     查看提交统计信息

sourceTree 使用

一、设置拉取、推送默认密码

    仓库 -> 远程仓库 -> 将路径配置成 http://用户名:密码@172.16.x.xx:7990/scm/ibg/ibg.git

gitLab生成公钥私钥

$ ls -l .ssh            // 查看.ssh目录下有哪些配置文件

$ cd .ssh                    // 进入到.ssh目录

$ ssh-keygen -t rsa -C "liusiguang@youxin.com"                 // 创建公钥和私钥

    创建时会提示输入的密码直接回车为空就行

    会创建这两个文件: id_rsa.youxin、id_rsa.youxin.pub

$ vi config            // 创建一个config文件,将下面内容加入进去,config文件就是配置git起哪个公钥

    Host *.youxin.com
IdentityFile ~/.ssh/id_rsa.youxin
User git

$ vim id_rsa.youxin.pub         // 将.pub文件内的内容copy出来

$ 进入gitlab -> setting -> 点左侧栏的ssh keys

    key的就把刚才id_rsa.youxin.pub的内容粘进去

    title: 随便起名

$ SourceTree配置

    1、偏好设置 电子邮件填写 "liusiguang@youxin.com"

    2、仓库/仓库设置 -> 高级 -> 电子邮件填写 "liusiguang@youxin.com"

    3、仓库/仓库设置 -> 远程仓库 -> 编辑配置文件(路径中修改为gitlab中拉代码的SSH地址,而不是HTTP的)

遇到问题

一、工作test分支冲突

    1、测试不试不合test

    2、如果test, A、B两个分支冲突解决方法

        1、如果一起上,将A、B合并处理冲突

        2、将A上线,合并到master,在将B拉master解决冲突,在合test

    3、如果同一文件不改同一行不会冲突

| 参考资料:
|
| 可视化工具:SourceTree
| 远端:stash
|
| http://iissnan.com/progit/
| http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/
| http://www.yiibai.com/git/git_update_operation.html