git

Git 是一个非常出色的版本控制工具。

工作流程

# 可选https和ssh,如果需要频繁提交的话建议使用ssh,要添加相应的证书
git clone git@github.com:phpredis/phpredis.git 
# 从远程服务器拉取文件
git pull 
# 创建并且检出到分支
git checkout -b check_in_demo 
vi hello_world.php
# 添加到缓存区
git add hello_world.php
git commit -m 'Check in demo.' 
git push origin check_in_demo
git checkout master
git merge --no-ff check_in_demo
git commit -m 'merge from branch check_in_demo'
git push origin master

或者

git init
touch hello_world.php
git add hello_world.php
git commit -m 'init files'
git remote add origin git@github.com:phpredis/phpredis.git 
git push --set-upstream origin master

常见命令

远程仓库相关命令

检出仓库:

$ git clone git://github.com/jquery/jquery.git

检出仓库:直接检出分支 2.0.0,指定远程仓库名称为 github (默认为 origin)、检出到文件夹 jquery2 (默认为 jquery)

$ git clone -o github -b 2.0.0 git://github.com/jquery/jquery.git jquery2

查看远程仓库:

$ git remote -v

添加远程仓库:

$ git remote add [name] [url]

删除远程仓库:

$ git remote rm [name]

修改远程仓库:

$ git remote set-url --push [name] [newUrl]

拉取远程仓库:

$ git pull [remoteName] [localBranchName]

推送远程仓库:

$ git push [remoteName] [localBranchName]

强制推送更改:

$ git push --force origin master
  • 如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:
$ git push origin test:master         // 提交本地test分支作为远程的master分支
$ git push origin test:test              // 提交本地test分支作为远程的test分支

分支(branch)操作相关命令

查看本地分支:

$ git branch

查看远程分支:(如果还是看不到就先 git fetch origin 先)

$ git branch -r

创建本地分支:(注意新分支创建后不会自动切换为当前分支)

$ git branch [name]

切换分支:

$ git checkout [name]

创建新分支并立即切换到新分支:

$ git checkout -b [name]

直接检出远程分支: (如:git checkout -b myNewBranch origin/dragon)

$ git checkout -b [name] [remoteName]

删除分支:

$ git branch -d [name]

-d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项

合并分支:

$ git merge [name]

将名称为[name]的分支与当前分支合并

合并最后的2个提交:

$ git rebase -i HEAD~2

数字2按需修改即可(如果需提交到远端$ git push -f origin master 慎用!)

创建远程分支(本地分支push到远程):

$ git push origin [name]

删除远程分支:

$ git push origin :heads/[name]

$ git push origin :[name]

修改本地分支名称:

git branch -m <old_branch_name> <new_branch_name>

直接修改远程分支名称(不修改本地的):

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

修改本地及其远程分支的名称:

1. git branch -m <old_name> <new_name>
2. git push <remote> --set-upstream new_name
3. git push <remote> :old_name

对于其它客户端的仓库,需要执行如下两个命令获取最新的修改:

4. git fetch <remote>
5. git remote prune <remote>
  • 创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔)

方法1:

$ git checkout --orphan <branch_name>
$ git rm -rf *

方法2:

$ git symbolic-ref HEAD refs/heads/[name]
$ rm .git/index
$ git clean -fdx

版本(tag)操作相关命令

查看版本:

$ git tag

创建版本:

$ git tag [name]

删除版本:

$ git tag -d [name]

查看远程版本:

$ git tag -r

创建远程版本(本地版本push到远程):

$ git push origin [name]

删除远程版本:

$ git push origin :refs/tags/[name]

合并远程仓库的tag到本地:

$ git pull origin --tags

上传本地tag到远程仓库:

$ git push origin --tags

创建带注释的tag:

$ git tag -a [name] -m 'yourMessage'


忽略一些文件、文件夹不提交

gitignore : 在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,也可以把本身加进去,比如:

.ignore
target
bin
*.db

后悔药

删除当前仓库内未受版本管理的文件:

$ git clean -f

恢复仓库到上一次的提交状态:

$ git reset --hard

回退所有内容到上一个版本:

$ git reset HEAD^

回退a.py这个文件的版本到上一个版本:

$ git reset HEAD^ a.py

回退到某个版本:

$ git reset 057d

将本地的状态回退到和远程的一样:

$ git reset –hard origin/master

向前回退到第3个版本:

$ git reset –soft HEAD~3

修改最后的提交日志:

$ git commit --amend

修改最后的提交日期为当前时间:

$ git commit --amend  --date="$(date -R)"

查看提交日志

》查看文件中的每一行的作者、最新的变更提交和提交时间

$ git blame [fileName]

》查看仓库历史记录 有三个应该知道的选项。 --oneline - 压缩模式,在每个提交的旁边显示经过精简的提交哈希码和提交信息,以一行显示。 --graph - 图形模式,使用该选项会在输出的左边绘制一张基于文本格式的历史信息表示图。如果你查看的是单个分支的历史记录的话,该选项无效。 --all - 显示所有分支的历史记录 把这些选项组合起来之后如下:

使用

$ git log --oneline --graph --name-status

既可以看到简介的日志信息,也可以看到改了哪些文件,一举两得:

差异查看

$ git diff --name-status HEAD~2 HEAD~3 <-- 获得两个版本间所有变更的文件列表
$ git diff HEAD HEAD~1 <-- 查看最近两个提交之间的差异
$ git diff HEAD HEAD~2 <-- 查看第1个与第3个提交之间的差异
^ - 代表父提交,^n 表示第n个父提交,^相当于^1 git寻根:^和~的区别 - 分析得很到位
~ - 代表连续的提交,~n相当于连续的第n个提交
$ git diff master..test <-- 比较两个分支之间的差异
$ git diff master...test <-- 比较master、test的共有父分支和 test 分支之间的差异
$ git diff test <-- 比较当前工作目录与 test 分支的差异
$ git diff HEAD <-- 比较当前工作目录与上次提交的差异
$ git diff HEAD -- ./lib  <-- 比较当前工作目录下的lib目录与上次提交的差异
$ git diff --stat  <-- 统计一下有哪些文件被改动,有多少行被改动
$ git diff --cached  <-- 查看下次提交时要提交的内容(staged,添加到索引中)

技巧

git设置忽略文件、文件夹

git设置忽略文件、文件夹的方式有三种,分别介绍如下。其中涉及的ignore文件均为如下格式:

方式一(最常用):

在仓库目录下新建名为 .gitignore 的文件(点开头,没有文件名,故不能在windows目录下直接创建,必须右键——Git Bash,按Linux的方式来新建.gitingore文件)。

.gitignore 文件对其所在目录以及全部子目录均有效。通过将.gitignore 添加到仓库,其他开发者更新该文件到本地仓库,可共享同一套忽略规则。如下图,这里设置忽略 caches 文件夹及其子目录:

方式二:

通过配置仓库目录下的 .git/info/exclude 文件来设置忽略文件。这种方式对仓库全局有效,但只能对自己本地仓库起作用,其他开发者不能共享忽略规则。除非他人也修改本地仓库的该文件。

方式三:

通过配置 .git/config 文件的 core.excludesfils 选项,指定一个含有忽略规则的文件(完整路径)。如下图所示,则忽略规则在文件 F:/gitignore.txt 中(文件名可任意取)。该方式的作用域也是全局的。

https://my.oschina.net/milletes/blog/798963

参考命令

Git global setup

git config --global user.name "wuyt"
git config --global user.email "wuyt@meitu.com"

Create a new repository

git clone git@gitlab.meitu.com:wuyt/photo.git 
cd photo
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

Existing folder or Git repository

cd existing_folder
git init
git remote add origin git@gitlab.meitu.com:wuyt/photo.git git push -u origin master

问题

1. git: Error: Some Local Refs Could Not Be Updated;

Try Running git remote prune origin To Remove Any Old, Conflicting Branches

2. fatal: refusing to merge unrelated histories

解决方法:

git pull --allow-unrelated-histories

参见

参考链接