好吧,我觉得是时候做个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 合并的过程:
- git rebase 分支名
- 有冲突解决冲突,无冲突直接push本地分支
- 解决完冲突-->git add . --> git rebase --continue
- 继续解决冲突,重复第三步操作,知道rebase完成分支代码合并,推送到远程分支。
- git rebase --continue 可能会导致 rebase on progress 某个进程不动,此时需要git rebase --skip ,跳过当前的进度,继续合并。
- git rebase --abort -->终止此次的rebase过程,将此分支代码回复到此前未rebase的commit点。
注:不能在一个分支上多次rebase同一个分支的代码,这样会导致自己和自己冲突
示例如下:
>$ 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路径