基本步骤

  • $ 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

  1. $ git submodule add git://github.com/my/submodule.git ./submodule
  2. $ git submodule update --init 取得新仓库的 submodule
  3. $ git submodule update --recursive --init 取得子仓库的更新
  4. $ cd ./submodule
  5. $ git pull origin master

Github fork 项目后更新

  1. $ git remote add upstream https://原始项目地址
  2. $ git fetch upstream
  3. $ git checkout master
  4. $ git merge upstream/master
  5. $ git push

修改远程仓库地址

  1. 先查看改名前的URL下的版本名:$ git remote -v
  2. 然后设置新的URL:$ git remote set -url 版本名 新的URL
  3. 或者删掉原来的版本,再add进新的URL:
    1. $ git remote rm 版本名
    2. $ git remote add 版本名 新的URL

Git回滾

  1. $ git reset --hard <commit_id>
  2. $ git push origin HEAD --force
  3. 根据 –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

  1. $ git rebase -i -p <some HEAD before all of your bad commits>
  2. 标记需要更改的 commit 为 edit
  3. $ git commit --amend --author="New Author Name <email@address.com>"
    1. 如果只需要改上一个 commit,执行这一步就可以了,不需要 rebase
    2. 如果要同时改变 author 和 committer:
      $ git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
  4. $ git rebase --continue

创建新的空分支

  1. $ git symbolic-ref HEAD refs/heads/
  2. $ rm .git/index
  3. $ git clean -fdx
  4. < do work >
  5. $ git add .
  6. $ 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

  1. $ rm .git/refs/remotes/origin/custom/100acc
  2. $ git fetch --prune origin