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