git 实用整理

好吧,我觉得是时候做个git使用笔记了!

个人警示点

1. **在一般情况下,本地所做的更改直接commit就可以了,例如一个完整新功能的添加;但若是修改之前的页面代码逻辑,个人推荐在每次commit 提交本地更改之前都应采用git diff的形式,来对比和check自己在本地所做的更改。

git 小技巧

1. git init 初始化错文件夹位置 
    --> find . -name ".git" | xargs rm -Rf 或者显示隐藏文件删除.git 目录即可

mac git 有关配置

1. gitignore 配置全局忽略文件(主要针对mac下的.DS_Store文件)

a).vim  ~/.gitignore_global  --> vim 指令令语法请自行百度
    创建~/.gitignore_global文件,把需要全局忽略的文件
    写入该文件,语和.gitignore一样

    -->示例:
    tignore_global
    ####################################
    ######## OS generated files ########
    ####################################
    .DS_Store
    .DS_Store?
    *.swp
    ._*
    .Spotlight-V100
    .Trashes
    Icon?
    ehthumbs.db
    Thumbs.db
    ####################################
    ############# packages #############
    ####################################
    *.7z  
    *.dmg
    *.gz
    *.iso
    *.jar
    *.rar
    *.tar
    *.zip

b).vim  ~/.gitconfig --> vim 指令令语法请自行百度
    在~/.gitconfig中引入.gitignore_global文件
     [core]
     excludesfile =/Users/kai_w/.gitignore_global

     或者通过指令 git config --global     
     core.excludesfile/Users/kai_w/.gitignore_global
  
     配置成功。

git 初始概念:

1. 工作区       --> 当前项目所在的工作目录,每次修改都在工作区。
2. 暂存区       --> 工作区当中修改的文件通过git add . 指令添加到暂存区当中。
3. 本地仓库    --> 
4. 服务器仓库 --> 

git 基础指令:

1. git status  -->
2. git add .    -->
3. git commit -->

git本地仓库和远程仓库关联的初始步骤如下:

1. 在远程服务器创建仓库.

2. 本地创建git 仓库:
    -->在当前项目根目录 git init

3. 与远程服务器关联:
    -->git remote add origin "远程服务器地址(http or ssh)"

4. 推送本地目录结构到远程仓库:
    -->git pull origin maser  or git pull origin maser --allow-unrelated-histories
    ** 两者之间的区别在于(待研究,一般第一种就可以了)
    -->git push origin master:master

5. 将本地新增or修改文件添加到缓存区:
    --> git add .

6. 查看本地缓存区修改的文件
    -->git status

7. 本地提交修改文件或新增文件
    -->git commit "commit message"

8. 推送本地修改文件到远程仓库
    -->git push origin local-branchname:local-branchname
    or 简略写法
    -->git push origin remote-branchname

git 本地分支和远程分支相关操作

1. 查看本地分支
    -->git branch (带*的为当前项目所在分支)

2. 查看远程分支
    -->git branch -r 

3. 本地创建分支
    -->git branch -b branchname

4. 切换当前分支
    -->git checkout brancname
    **  3、4 步骤合并为git checkout -b branchname

>5. 本地分支的删除
    -->git branch -D branchname

>6. 推送本地分支到远程仓库
    -->git pull origin remote-branchname
    -->git push origin local-branchname:remote-branchname
    or git push origin remote-branchname
(每次push之前都应先pull;将当前所在分支的修改推送到远程服务器的指定分支)

7.删除远程仓库分支
   -->git push origin :remote-branchname

git remote show origin  #查看远程分支和本地分支的对应关系
git remote prune origin #删除远程已经删除过的分支

git fetch 和 git pull

1. git fetch  
    git checkout -b localbranchname origin/remote-branchname
    获取远程所有分支和tag最新的代码到本地,从远程分支上检索创建一个本地分支。

2. git fetch 
    git tag 
    git checkout -b localbranchname  tagname
     获取远程所有分支和tag最新的代码到本地, 查看所有tag名,从当前tag上检索
     创建一个本地分支。(此步骤一般用于紧急修复版本线上bug,也就是git flow
     思想的hotfix分支概念。)

3. git  fetch origin master 
    git  log -p master..origin/master
    git  merge origin/master
    获取远程master分支的最新代码到本地,查看远程master分支和本地master分
    支的差异,合并远程master分支到本地master分支。
    或者整个步骤替换为:
    git fetch origin master:test
    git diff test
    git merge test

4. git pull origin master
    第3步的操作可以直接用pull命令代替,pull 直接拉取远程分支master的代码到
    当前分支并自动合并到当前分支。

**注:git pull == git fetch and git merge。本人基本很少用git fetch 指令,一般用
它作为从远程分支节点上检索出一个新的本地分支;git fetch 比git pull指令更加准
确些,可以考虑使用**

git tag

1. git tag 
    列出已有的tag所有标签

2. git tag -l "tagname"
    列出符合标签名的所有标签

3. git tag tagname 
    创建轻量级的tag

4. git tag -a tagname -m "tag desc"
    创建带有信息的tag,-m后面带的就是注释信息,一般是当前版本的作用。

5. git log --oneline
    git tag -a commit-log
    为commit 点添加一个tag。

6. git tag -d tagname 
    删除指定tag

7. git push origin --tags
    推送本地创建的tag到服务器。

git merge 和 git rebase

git rebase 合并的过程:

  1. git rebase 分支名
  2. 有冲突解决冲突,无冲突直接push本地分支
  3. 解决完冲突-->git add . --> git rebase --continue
  4. 继续解决冲突,重复第三步操作,知道rebase完成分支代码合并,推送到远程分支。
  5. git rebase --continue 可能会导致 rebase on progress 某个进程不动,此时需要git rebase --skip ,跳过当前的进度,继续合并。
  6. git rebase --abort -->终止此次的rebase过程,将此分支代码回复到此前未rebase的commit点。

注:不能在一个分支上多次rebase同一个分支的代码,这样会导致自己和自己冲突

git 实用整理_第1张图片
git 本地模拟合并
示例如下:
>$ git branch
  develop
* develop_1
  develop_2
  feature_1
  feature_2
  master
>$ ls -l 
  total 16
  -rw-r--r--  1 kai_w  staff   9 11 27 16:27 README.md
  -rw-r--r--  1 kai_w  staff  18 11 27 16:28 test.txt

> feature_1分支上的修改和本地提交:
bogon:gitdemo wangkai$ git commit -m "feature_1 本地的提交"
[feature_1 89ec653] feature_1 本地的提交
1 file changed, 1 insertion(+)
bogon:gitdemo kai_w$ git log
commit 89ec653eb4607721b6fc302405115d8c1aed0d30 (HEAD -> feature_1)
Author: kai_w <...>
Date:   Mon Nov 27 18:32:36 2017 +0800
    
feature_1 本地的提交

commit 8d158b21513d2e518b365b2a496f76a08c3c62b1 (origin/master,         
origin/HEAD, master, feature_2, develop_2, develop_1, develop)
Author: kai_w <...>
Date:   Mon Nov 27 16:28:56 2017 +0800

frist commit

commit dab4c3f7ce25013a0681908afd96786b6896cf30
Author: kai_w <...>
Date:   Sat Oct 28 14:51:19 2017 +0800

Initial commit

feature_1 上目前只有两个提交记录,分别为A和B

> feature_2分支上的修改和本地提交:

bogon:gitdemo kai_w$ git commit -m "feature_2本地相同的更改"
[feature_2 1706806] feature_2本地相同的更改
1 file changed, 1 insertion(+)

bogon:gitdemo kai_w$ git log
commit 170680640659ced36d862b2854ce5738004cfe92 (HEAD -> feature_2, 
origin/feature_2)
Author: kai_w <...>
Date:   Mon Nov 27 18:38:10 2017 +0800

feature_2本地相同的更改

commit 8d158b21513d2e518b365b2a496f76a08c3c62b1 (origin/master,     
origin/HEAD, master, develop_2, develop_1, develop)
Author: kai_w <...>
Date:   Mon Nov 27 16:28:56 2017 +0800

frist commit

commit dab4c3f7ce25013a0681908afd96786b6896cf30
Author: kai_w <...>
Date:   Sat Oct 28 14:51:19 2017 +0800

Initial commit

feature_2 上目前只有两个提交记录,分别为A和C

#下面是具体的区别
>
  a.切换到develop_2分支,将feature_2上的提交信息合并过来
     git checkout develop_2 
     git merge feature_2
     develop_2分支上的提交记录和feature_1上的提交记录一致

  b.切换到develop_1分支,保持和feature_1目录上的提交记录一致
     git checkout develop_1
     git merge feature_1

  c.git rebase 操作
     git rebase develop_2
     解决冲突
     git add .
     git rebase --continue

  d.查看当前develop_1分支上的提交记录-->git log

  bogon:gitdemo kai_w$ git log
  commit ce2c32110b1f66e34c9c2fc6eaa1b44227295d35 (HEAD -> develop_1)
  Author: kai_w <...>
  Date:   Mon Nov 27 18:32:36 2017 +0800
  
  feature_1 本地的提交

  commit 170680640659ced36d862b2854ce5738004cfe92 (origin/feature_2, 
  feature_2, develop_2)
  Author: kai_w <...>
  Date:   Mon Nov 27 18:38:10 2017 +0800
  
 feature_2本地相同的更改

  commit 8d158b21513d2e518b365b2a496f76a08c3c62b1 (origin/master, 
  origin/HEAD, master, develop)
  Author: kai_w <...>
  Date:   Mon Nov 27 16:28:56 2017 +0800

  frist commit
  
  commit dab4c3f7ce25013a0681908afd96786b6896cf30
  Author: kai_w <...>
  Date:   Sat Oct 28 14:51:19 2017 +0800
  
  Initial commit
  
  提交记录结构:A  -->C  -->B

>切换到feature_1分支

  a.git merge 具体操作
  git merge feature_1
  手动解决冲突
  git add .
  git commit -m "merge "

  b.查看当前feature_1分支上的提交记录-->git log

  bogon:gitdemo kai_w$ git log
  commit d1c4ae5a5f46cbffe5ac6694d276b50b231b27c3 (HEAD -> feature_1)
  Merge: 89ec653 1706806
  Author: kai_w <...>
  Date:   Mon Nov 27 18:52:54 2017 +0800
      
  merge develop_2

  commit 170680640659ced36d862b2854ce5738004cfe92 (origin/feature_2, 
  feature_2, develop_2)
  Author: kai_w <...>
  Date:   Mon Nov 27 18:38:10 2017 +0800

  feature_2本地相同的更改

  commit 89ec653eb4607721b6fc302405115d8c1aed0d30
  Author: kai_w 
  Date:   Mon Nov 27 18:32:36 2017 +0800

  feature_1 本地的提交

  commit 8d158b21513d2e518b365b2a496f76a08c3c62b1 (origin/master,   
  origin/HEAD, master, develop)
  Author: kai_w <...>
  Date:   Mon Nov 27 16:28:56 2017 +0800

  frist commit

    commit dab4c3f7ce25013a0681908afd96786b6896cf30
    Author: kai_w <...>
    Date:   Sat Oct 28 14:51:19 2017 +0800

    Initial commit
        
    提交记录结构:A  ->B  -->C   -->D

总结:git merge 和 git rebase 在分支之间未产生冲突的时候,会保留整体的树结构一致,若合并过程中产生冲突,git merge 则会在合并的过程中产生一个merge节点,会破坏原有的提交树状结构,推荐使用git rebase

git reset 和 git revert

1. git reset -->
    * --soft – 缓存区和工作目录都不会被改变
    * --mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
    * --hard – 缓存区和工作目录都同步到你指定的提交



2. git revert -->
    * git revert  产生一个新的commit节点,与指定的SHA对应的commit是相反
      的。

git log 和 git reflog

git remote

git ssh 省账号密码pull 和 push配置(mac)

-->以coding.net为例,配置coding 网站的多个账号的ssh

1. 第一个账号生成ssh-key
终端操作如下:
cd ~/.ssh
ls -l
ssh-keygen -t rsa -C "第一个账号邮箱"
终端会提醒你输入生成文件的名字:id_isa_first

2. 第二个账号生成ssh-key
终端操作如下:
cd ~/.ssh
ls -l
ssh-keygen -t rsa -C "第二个账号邮箱"
终端会提醒你输入生成文件的名字:id_isa_second

3. 新ssh-key添加到ssh agent中
ssh-add ~/.ssh/id_rsa_first
ssh-add ~/.ssh/id_rsa_second
   
4. ls -l
-rw-------  1 user  staff  1679  2 27  2017 id_rsa_first
-rw-r--r--  1 user  staff   404  2 27  2017 id_rsa_first.pub
-rw-------  1 user  staff  1679  3 31  2017 id_rsa_second
-rw-r--r--  1 user  staff   398  9  9 22:41 id_rsa_second.pub
-rw-r--r--  1 user  staff  9090 11  7 16:55 known_hosts

5. 在coding对应账号的个人设置 -- ssh 公钥选项 当中添加对应账号公共的ssh key

6. 添加对应ssh公钥的配置文件vi config
在vim编辑模式下,按 i 进入编辑模式:添加对应配置文本如下所示:
# first.coding (first mail)
Host git.coding.net
HostName git.coding.net
User username
IdentityFile ~/.ssh/id_rsa_first

# second (second mail)
Host coding-second
HostName git.coding.net
User username
IdentityFile ~/.ssh/id_rsa_second

esc退出编辑模式,输入:wq,退出vim并保存内容。
 
7. 测试一下 
ssh -T [email protected]
ssh -T git@coding-second
bogon:.ssh user$ ssh -T git@coding-second
Coding 提示: Hello ..., You've connected to Coding.net via SSH. This is a personal key.
...,你好,你已经通过 SSH 协议认证 Coding.net 服务,这是一个个人公钥

8. coding默认clone 路径是http , 使用ssh 路径,注意第二个账号需要将中间路径进行替换,诸如:
[email protected]:kai_w/MyWork.git
-->git@coding-second:kai_w/MyWork.git
替换成config文件当中配置的host路径
git 实用整理_第2张图片
添加对应账号的公钥

git flow 思想(待后期整理补充)

你可能感兴趣的:(git 实用整理)