我的Git学习笔记
Contents
常用配置
#配置用户名
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 commit
或git 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
如果可以看到图中子模块前面有一个
-
,说明子模块文件还未检入(空文件夹), 这时就要调用更新子模块命令来拉取数据.
删除子模块
- 从文件
.gitmodules
删除相关的子模块部分 - 暂存
.gitmodules
:git add .gitmodules
- 从文件
.git/config
删除相关的子模块部分 - 执行命令:
rm --cached path_to_submodule
- 执行命令:
rm -rf .git/modules/path_to_submodule
- 提交修改:
git commit -m "remove submodule xxxsubmodule"
- 删除未跟踪的文件:
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