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 本地模拟合并
示例如下:
>$ 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 <wk343321@126.com>
  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 <SHA> 产生一个新的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 git@git.coding.net
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 路径,注意第二个账号需要将中间路径进行替换,诸如:
git@git.coding.net:kai_w/MyWork.git
-->git@coding-second:kai_w/MyWork.git
替换成config文件当中配置的host路径
添加对应账号的公钥

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342