Article
GIT操作记录手册
Git的每次提交都有一个唯一的ID与之对应,所有的TAG/Branch/Master/HEAD等等,都是一个软链接/别名而已!这个是理解好Git的基础!
# 提交最佳实践
- commit 只改一件事情。
- 如果一个文档有多个变更,使用
git add --patch只选择文档中的部分变更进入stage。具体怎么使用,键入命令后在输入? - 写清楚 commit message
# 配置
# 内建的图形化 git:
gitk
# git服务器
搭建git服务器也很方便,有很多web-server的版本,我试用了下scm-manager使用挺简单的! 如果已经有了SVN的服务器,可以直接使用git-svn检出到本地!!
# 配置环境
git config --global user.email "XXX"
git config --global user.name "XXX"
# 换行(\r\n)提交检出均不转换
基本上都在windows操作系统上工作,不需要进行转换!
git config --global core.autocrlf false
- true 提交时转换为LF,检出时转换为CRLF
- input 提交时转换为LF,检出时不转换
- false 提交检出均不转换
# core.safecrlf
- true 拒绝提交包含混合换行符的文件
- false 允许提交包含混合换行符的文件
- warn 提交包含混合换行符的文件时给出警告
# 默认分支
.git/config如下的内容:
[branch "master"]
remote = origin
merge = refs/heads/master
这等于告诉git两件事:
- 当你处于master branch, 默认的remote就是origin。
- 当你在master branch上使用git pull时,没有指定remote和branch,那么git就会采用默认的remote(也就是origin)来merge在master branch上所有的改变
如果不想或者不会编辑config文件的话,可以在bush上输入如下命令行:
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
之后再重新git pull下。最后git push你的代码,到此步顺利完成时,则可以在Github上看到你新建的仓库以及你提交到仓库中文件了OK。
# 修改默认Git编辑器
$ git config core.editor vim
$ git config --global core.editor vi
git config --global core.editor "vim"
export GIT_EDITOR=vim
# 常用基本操作
| 操作 | 说明
|:-------------------------------------------- -|:-------------------------------------------------------
| git init |
| git init --bare | 服务端使用bare(空架子,赤裸)的方式
| git status | 使用git打的最多的就是status命令,查看状态的同时会提示下一步的操作!
| git diff | 工作空间和index/stage进行对比
| git diff --cached | index/stage与本地仓库进行对比
|增加到变更(index/stage) |
| git add . | 将当前目录添加到git仓库中,常用命令!
| git add -A | 添加所有改动的文档
| git add -u | 只加修改过的文件,新增的文件不加入
| git rm --cached
$ git config core.filemode false
git config --get core.filemode
git config --global core.filemode false
git config --global core.autocrlf false
cat .git/config
.gitconfig
git ls-files
# 按功能点完整的操作步骤
# 查看指定版本文件内容
Administrator@WINSELIU /e/git/hello (master)
$ git ls-tree master
100644 blob 139b30f9054cf77bd2eeabcebaf6ca3f32cd1d50 abc
Administrator@WINSELIU /e/git/hello (master)
$ git cat-file -p 139b30f9054cf77bd2eeabcebaf6ca3f32cd1d50
# 回归指定的版本文件
# 通过上面的命令得到该文件的版本
winse@Lenovo-PC ~/esw/git
$ git checkout 4179d96 esw/DTA/ISMI_CU/docs/测试/省汇聚平台/dta/kettle/file/hive2mysql.ktr
# 查看提交版本的指定文件内容
git log abc # 获取文件提交ID
git cat-file -p <commit-id> # 获取treeID
git cat-file -p <tree-id> # 获取当前tree的列表
git cat-file -p <file-blob-id>
# 根据格式输出日志
$ git log --pretty=oneline
$ git log --pretty=short
$ git log --pretty=format:'%h was %an, %ar, message: %s'
$ git log --pretty=format:'%h : %s' --graph
$ git log --pretty=format:'%h : %s' --topo-order --graph
$ git log --pretty=format:'%h : %s' --date-order --graph
# https://stackoverflow.com/questions/1441010/the-shortest-possible-output-from-git-log-containing-author-and-date
git log --pretty=format:"%h%x09%an%x09%ad%x09%s"
pretty = format:%C(auto,yellow)%h%C(auto,magenta)% G? %C(auto,blue)%>(12,trunc)%ad %C(auto,green)%<(7,trunc)%aN%C(auto,reset)%s%C(auto,red)% gD% D
git log --pretty=format:'%h %ad %s | %an' --date=short
你也可用‘medium’,‘full’,‘fuller’,‘email’ 或‘raw’. 如果这些格式不完全符合你的相求, 你也可以用‘–pretty=format’参数(参见:git log)来创建你自己的"格式“.
# 本地提交后再次修改
修改注释
git commit --amend
内容修改
# edit file
git add file
git commit --amend
提交了不该提交的,并撤回
刚刚提交的不完整,想修改一些东西,加到刚才的提交中
commit -> modify -> add -> amend
git reset HEAD^
git status
cat abc
git diff
git commit -a -m "for test reset"
git log
git diff
vi abc
git add abc
git commit --amend
git status
git diff
git show master:abc
git log
# 没有push到远程库的提交,本地可以做的事情
- git reset: 用于回溯,回到原来的提交节点,然后可以merge多次提交合并为一个
- git rebase
:在origin分支的基础上,合并当前分支上的提交,形成线性提交历史。 会把当前分支的提交保存为patch,然后切到origin分支应用patch,形成线性的提交,common-origin-current。
rebase冲突处理时,使用git add && git rebase --continue。如果你使用了git add && git commit,那么当前冲突使用git rebase --skip即可。
# 处理本地和服务器之间冲突的方式
- 以本地为主。 git push -f
- 归并merge。 git pull 或者 git fetch && git merge
从stash恢复出现冲突,可以先提交,然后在pop,最后处理冲突。一般提交到本地index中的数据才是自己想要的,从stash中获取的数据只是临时的,可以直接用HEAD的数据内容覆盖,省去处理冲突的时间。
$ git add -u
$ git commit -m 'update XXXX'
$ git stash pop
$ git status | grep 'both modified' | grep ' ssh-config' | awk -F: '{print $2}' | while read line ; do git show HEAD:"$line" > "$line" ; done
# 从Github远程服务上拿其他分支:
Administrator@WINSELIU /e/git/to-markdown (master)
$ git branch -r
origin/HEAD -> origin/master
origin/gh-pages
origin/jquery
origin/master
$ git checkout -b jquery origin/jquery
# 把本地的git项目发布到Github
touch README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:winse/flickr-uploader.git
git push -u origin master
Push an existing repository from the command line:
git remote add origin git@github.com:winse/flickr-uploader.git
git push -u origin master
如果已经存在remote origin,使用下面的方式修改远程的地址:
Administrator@WINSELIU /d/winsegit/flickr_uploader/chrome (master)
$ git remote set-url --add origin git@github.com:winse/flickr-uploader.git
Administrator@WINSELIU /d/winsegit/flickr_uploader/chrome (master)
$ git remote show origin
Warning: Permanently added 'github.com,192.30.252.128' (RSA) to the list of known hosts.
* remote origin
Fetch URL: git@github.com:winse/flickr-uploader.git
Push URL: git@github.com:winse/flickr-uploader.git
HEAD branch: (unknown)
# reset后撤回
可能存在已经更新的数据,先提交到临时缓存区
git stash
然后通过reflog得到需要撤回到的版本号
$ git reflog
ef9ccf7 HEAD@{0}: reset: moving to HEAD^^
4f317fe HEAD@{1}: commit (amend): 2015-03-04 d
仍然使用reset回退
git reset --hard 4f317fe
git stash pop
# 处理冲突
# git add 冲突文件
git reset
强制回退所有的操作:
git reset --hard
git clean -fd
强制检出新版本:
git fetch --all
git reset --hard origin/master
# git查看本地领先远程的提交
Administrator@WINSELIU /d/winsegit/winse.github.com (master)
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
# (use "git push" to publish your local commits)
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: about.md
# modified: blog/_posts/2014-01-21-monitoring-mobile-networks.md
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# default.html
no changes added to commit (use "git add" and/or "git commit -a")
Administrator@WINSELIU /d/winsegit/winse.github.com (master)
$ git log --oneline --decorate -5
0425ec5 (HEAD, master) 增加日志Github修改历史功能
f3a4a58 把TAG定位到首页,并分页以及按照年分类
d5097e3 (origin/master, origin/HEAD) plugins disabled in github page!
e75d62b test
876dd42 修复根目录下的md不能通过npp-windows请求编辑的BUG
Administrator@WINSELIU /d/winsegit/winse.github.com (master)
$ git cherry
+ f3a4a58cfead3aa76e4b92de3342bee5970accb7
+ 0425ec548aa4e3dd29cd6fbfa1b656543e85058e
# 找回游离的提交
绑定到新分支
git reflog # 查看本地操作历史
git branch head23 HEAD@{23} # 把分支head23指向/绑定到游离的提交
git的版本都是从分支开始查找的,如果没有被分支管理的提交就游离在版本库中! 所以在reset重新修改时,最好建立分支然后再提交! 如果发现类似的提交问题,就需要尽快的修复,不然提交的ID找不到就S了!
那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)
重置HEAD
git reset --hard HEAD@{23}
# 删除提交
删除提交E:
$ git tag F
$ git tag E HEAD^
$ git tag D HEAD^^
$ git checkout D
$ git cherry-pick master # 把master-patch应用到TAG-D
# fix conflicts
$ git status # 提交
$ git checkout master # checkout到master分支
$ git reset --hard HEAD@{1} # 重置master到删除E后的提交
# Git浏览特定版本的文件列表
git ls-tree --name-only -rt <SHA-ID>
# 删除没有被git track的文件
# 删除 untracked files
git clean -f
# 连 untracked 的目录也一起删掉
git clean -fd # -f force branch switch/ignore unmerged entries, -d if you have new directory
# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -x -fd
# 在用上述 git clean 前,建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git reset --hard ( or git reset then back to 1. )
git checkout . ( or specify with file names )
git reset --hard ( or git reset then back to 3. )
# 检出SVN项目
Administrator@ZGC-20130605LYE /e/git
$ git svn clone http://chrome-hosts-manager.googlecode.com/svn/trunk/
http://www.worldhello.net/2010/02/01/339.html下面提到的有意思:
Git-svn 是 Subversion 的最佳伴侣,可以用 Git 来操作 Subversion 版本库。这带来一个非常有意思的副产品——部分检出: 可以用 git-svn 来对 Subversion 代码库的任何目录进行克隆,克隆出来的是一个git版本库 可以在部分克隆的版本库中用 Git 进行本地提交。 部分克隆版本库中的本地提交可以提交到上游 Subversion 版本库的相应目录中
如果需要密码的,使用方面的方式会报错git-svn died signal 11。可以先init,然后在fetch。
Kevin@Kevin-PC /cygdrive/d/dta-git
$ git svn init URL --username=NAME
Initialized empty Git repository in /cygdrive/d/dta-git/.git/
$ git svn fetch
Authentication realm: <https://IP:PORT> Subversion Repositories
Password for 'NAME':
# 输入密码后,ctrl+c退出后再重新下载
$ git svn fetch > fetch.log 2>&1
# Github添加项目主页github page(gh-pages)
提交后就可以访问了页面了。
Administrator@WINSELIU /d/winsegit/flickr_uploader/chrome (master)
$ git branch -a
* master
remotes/origin/master
Administrator@WINSELIU /d/winsegit/flickr_uploader/chrome (master)
$ git push origin master:gh-pages
Warning: Permanently added 'github.com,192.30.252.128' (RSA) to the list of known hosts.
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:winse/flickr-uploader.git
* [new branch] master -> gh-pages
Administrator@WINSELIU /d/winsegit/flickr_uploader/chrome (master)
$ git branch -a
* master
remotes/origin/gh-pages
remotes/origin/master
Creating Project Pages manually
cd repository
git checkout --orphan gh-pages
# Creates our branch, without any parents (it's an orphan!)
# Switched to a new branch 'gh-pages'
git rm -rf .
# Remove all files from the old working tree
# rm '.gitignore'
echo "My GitHub Page" > index.html
git add index.html
git commit -a -m "First pages commit"
git push origin gh-pages
# 子模块操作
Administrator@WINSELIU /d/winsegit/jae_winse (master)
$ git submodule add git@github.com:winse/flickr-uploader.git src/main/webapp/flickr
Administrator@WINSELIU /d/winsegit/jae_winse (master)
$ git submodule status
635090c5a754eebf5ce6566b7f8c65446b764f51 src/main/webapp/flickr (heads/master)
Administrator@WINSELIU /d/winsegit/jae_winse (master)
$ git commit -m "add submodule"
[master c7dc8c7] add submodule
warning: LF will be replaced by CRLF in .gitmodules.
The file will have its original line endings in your working directory.
2 files changed, 4 insertions(+)
create mode 100644 .gitmodules
create mode 160000 src/main/webapp/flickr
如:$ git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
初始化子模块:$ git submodule init ----只在首次检出仓库时运行一次就行
更新子模块:$ git submodule update ----每次更新或切换分支后都需要运行一下
删除子模块:(分4步走哦)
- $ git rm --cached [path]
- 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉
- 编辑“.git/config”文件,将子模块的相关配置节点删除掉
- 手动删除子模块残留的目录
# 检出(Checkout)仓库的一部分内容
;; ADD 2018-5-27
类似SVN检出子目录的功能。在git里面叫做 Sparse checkout (稀疏的检出)。
: 先初始化一个git空仓库
$ mkdir hello-scala-mapreduce
$ cd hello-scala-mapreduce/
$ git init
Initialized empty Git repository in /mnt/f/temp/hello-scala-mapreduce/.git/
: 关联远程仓库
$ git remote add -f origin https://github.com/winse/helloworld.git
Updating origin
remote: Counting objects: 290, done.
remote: Total 290 (delta 0), reused 0 (delta 0), pack-reused 290
Receiving objects: 100% (290/290), 761.75 KiB | 326.00 KiB/s, done.
Resolving deltas: 100% (49/49), done.
From https://github.com/winse/helloworld
* [new branch] hello -> origin/hello
* [new branch] javaweb -> origin/javaweb
* [new branch] master -> origin/master
: 开启Sparse Checkout模式
$ git config core.sparsecheckout true
: 指定需要检出的子目录/文件
$ echo HelloScalaMapReduce > .git/info/sparse-checkout
$ git pull origin hello
From https://github.com/winse/helloworld
* branch hello -> FETCH_HEAD
$ ls
HelloScalaMapReduce
# 其他偶尔使用命令
git diff --check # 检查行尾有没有多余的空白
git remote prune <remotename>
git ls-remote --heads origin
git gc --prune=now
git ls-remote --heads <remote-name>
git rm -r --cached *
# 参考
-
http://josephjiang.com/entry.php?id=342 git-submodule没有更好的教程了
-
http://www.cnblogs.com/william9/archive/2012/09/01/2666767.html
-
http://marklodato.github.io/visual-git-guide/index-zh-cn.html
–END
Related
Related posts
-
在树莓派 Ubuntu Server 上跑 OpenClaw Browser:Chromium 无头模式实战
2026-03-08
-
Linux brew安装过程
2026-02-01
-
本地端口转发:访问远程 Linux 本地服务
2026-02-01
-
Fabric:命令行管道中的 AI 工具,更具价值的是里面 230 个系统提示词
2026-01-08