Git 笔记
Dec 28, 2012
基本步骤
$ git init
(初始化,创建新的git仓库)$ git add <filename>
(将改动添加到缓存区Index)$ git add -u
(automatically stage tracked files including deleting the previously tracked files)$ git commit -m
“改动信息”(实际提交改动到HEAD)$ git commit -v
(可在输入 log 时在下方显示改动内容)$ git push origin
<某个分支>(将本地仓库的改动origin提交到某个分支)$ git remote add origin <server>
(如果还未克隆现有仓库,可用此命令连接到服务器上的某个repo)
分支
$ git checkout -b
<分支名>(创建分支并切换过去)$ git checkout master
(切换回master分支)$ git branch -d
<分支名>(删除某分支)
更新与合并
$ git pull
(更新本地仓库至最新改动)$ git merge <branch>
(合并其他分支到当前分支)$ git diff <source_branch><target_branch>
(合并时会有冲突conflicts,需要手动修改,用此命令查看不同)$ git mergetool
(使用工具修改冲突的文件,推荐P4merge)
查看 log
$ git log -n 1
(查看最后一次提交)$ git log -n 1 --stat
(查看最近一次提交所有更改过的文件)$ git log -n 1 -p
(最近一次提交所有更改的细节)$ git log -p <filename>
(某个文件的提交记录)$ git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [... ]
标签
$ git tag
(列出现有标签)$ git tag -a -m <message>
(带有信息的标签)$ git tag
(为某个 commit 打上标签)$ git push --tags
(默认的 push 操作不会上传 tag)$ git push -d origin
(删除某个 tag)
衍合(rebase)
把在一个分支里提交的改变移到另一个分支里重放一遍.参考
$ git rebase <branch_to_be_rebased>
$ git rebase --continue
(有时会有冲突,用 mergetool
解决后用此命令完成 rebase)
Submodule
Submodule 的文件只存储在本地,主仓库只存储它的 URL 和它的某个 commit SHA1 值。
将某个仓库设为 submodule
$ git submodule add git://github.com/my/submodule.git ./submodule
$ git submodule update --init
取得新仓库的 submodule$ git submodule update --recursive --init
取得子仓库的更新$ cd ./submodule
$ git pull origin master
Github fork 项目后更新
$ git remote add upstream https://原始项目地址
$ git fetch upstream
$ git checkout master
$ git merge upstream/master
$ git push
修改远程仓库地址
- 先查看改名前的URL下的版本名:
$ git remote -v
- 然后设置新的URL:
$ git remote set -url 版本名 新的URL
- 或者删掉原来的版本,再add进新的URL:
$ git remote rm 版本名
$ git remote add 版本名 新的URL
Git回滾
$ git reset --hard <commit_id>
$ git push origin HEAD --force
- 根据 –soft –mixed –hard,会对working tree和index和HEAD进行重置:
git reset –mixed
:此为默认方式,不带任何参数的git reset,回退到某个版本,只保留源码,回退commit和index信息git reset –soft
:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可git reset –hard
:彻底回退到某个版本,本地的源码也会变为上一个版本的内容HEAD 最近一个提交
HEAD^ 上一个提交每次commit的SHA1值. 可以用 git log
看到,也可以在commit标签页里找到.
Changing the Last Commit Message
$ git commit --amend
Cleaning up local repository
$ git gc --prune=now
$ git remote prune origin
Specifying Dates
$ GIT_AUTHOR_DATE="Mon Oct 27 15:29:19 2014 +0800" GIT_COMMITTER_DATE="Mon Oct 27 15:29:19 2014 +0800" git commit -v
$ GIT_AUTHOR_DATE="Mon Oct 27 15:29:19 2014 +0800" GIT_COMMITTER_DATE="Mon Oct 27 15:29:19 2014 +0800" git commit --amend --date="Mon Oct 27 15:29:19 2014 +0800"
Change the author of a commit
$ git rebase -i -p <some HEAD before all of your bad commits>
- 标记需要更改的 commit 为
edit
$ git commit --amend --author="New Author Name <email@address.com>"
- 如果只需要改上一个 commit,执行这一步就可以了,不需要 rebase
- 如果要同时改变 author 和 committer:
$ git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
$ git rebase --continue
创建新的空分支
- $ git symbolic-ref HEAD refs/heads/
- $ rm .git/index
- $ git clean -fdx
- < do work >
- $ git add .
- $ git commit -v
其他:
- 分支名大小写问题:
git pull 时出现如下错误,原因是有人在 Linux 下提交了相同名字但大小写不同的分支,因为 Linux 是大小写不敏感的,但到了 OS X 或 Windows 下,拉取的时候就会出错
1 ! bacca66..6b9508a custom/100acc -> origin/custom/100acc (unable to update local ref) error: Ref refs/remotes/origin/custom/985 is at a2a6e32bfcef6e429c5e42fc7973f1d6e57eaae8 but expected d3c05036b295f6539870683e4c794cd9c3ae1579
$ rm .git/refs/remotes/origin/custom/100acc
$ git fetch --prune origin