常用配置

#配置用户名
git config --global user.name "Zhiyong yang"

#配置邮箱

git config --global user.email "dreamers.yzy@gmail.com"

#配置编辑器, 这个要先启动emacs: `emacs --daemon`
git config --global core.editor "emacsclient -t"

克隆远程代码库

git clone https://github.com/emacsist/emacsist.github.io

初始化本地git仓库

cd project
git init

将本地仓库映射到远程仓库

git remote add origin https://dreamer_yzy@bitbucket.org/dreamer_yzy/blog.git

拉取远程最新的代码

git pull

推送分支到远程仓库

git push origin master

格式为: git push origin 本地分支名[:远程分支名], 如果远程分支名不写, 就与本地的相同.

添加文件到git跟踪

git add file1 file2 ...

git add . 将当前所有除 .gitignore 里除开的忽略文件以外的文件添加到git跟踪.

git add dictory 将整个目录及子目录下的文件,添加到git跟踪.

查看git的状态

git status

提交到git暂存区

添加完整的代码提交说明
git commit

以简要的方式提交代码说明
git commit -m "提交说明"

查看当前文件与上一次提交的差异

git diff 文件路径

回退版本

回退到上一个版本

git reset --hard HEAD^

回退到指定的版本

git reset --hard commitId

查看git的命令历史

git reflog

如果使用 git reset --hard commitId 后, 再想恢复回指定的commitID,可以在这里查看对应的commitID.

撤消修改

git checkout -- file

这个修改的意思是最近一次的 git commitgit add

删除git暂存文件

git rm file

git的分支

创建分支

创建并切换到新的分支
git checkout -b 新的分支名 [远程分支,如 origin/develop]

如果没有指定远程分支, 就会以当前的分支为基础, 创建一个”新的分支名”的分支.

查看所有分支

git branch -v

切换分支

git checkout 分支名

合并分支

git merge --no-ff 分支名

注意, 这条命令的意思是将某个分支,合并到当前分支.

删除分支

git branch -d 分支名

删除远程分支

git push origin :the_remote_branch

推送到远程仓库

git push origin 分支名[:远程分支名]

拉取远程指定分支

git pull origin 分支名[:远程分支名]

git中的标签

在当前的提交打上标签

git tag v1.0

指定标签名和说明

git tag -a v1.0 -m "1.0 version" [commitID]

在指定的提交ID里添加标签

git tag v1.0 commitID

查看所有标签

git tag

查看标签信息

git show 标签名

删除标签

git tag -d v1.0

删除远程标签

git push origin :refs/tags/<tagname>

先删除本地标签,后再删除远程标签

推送标签到远程

git push origin <tagname>

例如
git push origin v1.0

推送所有标签到远程

git push origin --tags

Git中的子模块使用

添加子模块

git submodule add 仓库地址 路径

更新子模块

git submodule update

注意, 默认情况下, clone 主项目时, 子模块不会clone数据, 这时要使用以下命令来将子模块也update下来.

git submodule update --init --recursive

查看子模块

git submodule

如果可以看到图中子模块前面有一个-,说明子模块文件还未检入(空文件夹), 这时就要调用更新子模块命令来拉取数据.

删除子模块

  1. 从文件 .gitmodules 删除相关的子模块部分
  2. 暂存 .gitmodules: git add .gitmodules
  3. 从文件 .git/config 删除相关的子模块部分
  4. 执行命令: rm --cached path_to_submodule
  5. 执行命令: rm -rf .git/modules/path_to_submodule
  6. 提交修改: git commit -m "remove submodule xxxsubmodule"
  7. 删除未跟踪的文件: rm -rf path_to_submodule

.gitignore文件说明

忽略所有.a文件, * 为正则匹配,任意字符

*.a

但是 lib.a将被包括进git版本控制, !为非

!lib.a

或略build文件夹及其包含的所有文件

build/

忽略doc文件夹下所有以及包含的 .txt文件,不包括类似doc/test/tell.txt 这样的文件

doc/*.txt

忽略doc文件夹中所有 .txt文件

doc/**/*.txt

gitignore 文件不生效解决办法

首先,提交所有你当前所做的修改(git add xxx; git commit -m “xxx”)

然后

git rm -r --cached .
git add .
git commit -m "fixed untracked files"

pull 或者 push 一直指向当前分支

git pull origin "$(git branch | grep -E '^\* ' | sed 's/^\* //g')"

git push origin "$(git branch | grep -E '^\* ' | sed 's/^\* //g')"

回到git的根目录

cd  `git rev-parse --show-toplevel`

用master指向游离的版本

使用了 git checkout c681960 后, git的提示变成了这样子:

╭─yangzhiyong@yangzhiyongdeMacBook-Pro.local ~/Documents/git/emacsist  ‹c681960›
╰─➤  git branch -a
* (detached from 387a11a)
  master
  remotes/origin/master

恢复指示:

步骤1

首先, 找到最新的那个分支的commitID

git reflog

然后记下这个ID,比如,就是现在的c681960

然后进行如下操作:

步骤2

╭─yangzhiyong@yangzhiyongdeMacBook-Pro.local ~/Documents/git/emacsist  ‹c681960›
╰─➤  git checkout master
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  c681960 add head

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name c681960

Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
╭─yangzhiyong@yangzhiyongdeMacBook-Pro.local ~/Documents/git/emacsist  ‹master›
╰─➤

步骤3

╭─yangzhiyong@yangzhiyongdeMacBook-Pro.local ~/Documents/git/emacsist  ‹master›
╰─➤  git merge c6819605b8201ea983261cd6d84d7fc5d91c6c62
Updating 387a11a..c681960
Fast-forward
 .gitignore                             |  1 +
 db.json                                |  1 -
 source/_posts/我的Git学习笔记.md | 88 ++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------
 3 files changed, 45 insertions(+), 45 deletions(-)
 delete mode 100644 db.json

步骤4

恭喜你! 经过上面3个步骤, 你的master又是最新的指向了.

删除敏感数据

步骤1, 其中 path-to-your-remove-file 就是你要删除的文件路径
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path-to-your-remove-file' --prune-empty --tag-name-filter cat -- --all

推送到远程
git push origin master --force
git push origin --force --tags

GC清理
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

冲突时,以本地或远程分支的为准

以远程的为准
git checkout --theirs path_to_file

以本地的为准
git checkout --ours path_to_file

Git迁移到另一个远程服务器

#!/usr/bin/env bash

remote=origin 
for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do 
    #git branch --set-upstream-to $remote/$brname $brname;
    git checkout $brname
    git pull $remote $brname
done

git remote remove $remote
git remote add $remote https://github.com/emacist/xxx/xx.git
git push --all

参考文档