Git基本概念

Git原理

基本工作流程

  1. git add .:将工作区修改添加到暂存区;
  2. git commit -m '...':将暂存区修改提交到本地仓库,并添加描述;
  3. git remote add origin https://...git:第一次提交需设置远程仓库地址,以后无需设置;
  4. git pull origin branch:从远程仓库指定分支拉取最新代码;
  5. 处理冲突,然后重新add、commit;
  6. git push origin branch:向远程仓库推送本地仓库的改动;

撤回或修改

  1. 撤销上次提交(revert):git revert HEAD,加上-n避免自动commit;
  2. 撤销上次提交(reset):git reset HEAD
  3. 撤回到指定提交(reset):git reset commit-id
  4. 修改commit:git commit --amend "...",假如期间有新的暂存区改动,将合并到一个commit中;

注:reset会丢弃指定id之后的所有commit记录,可能导致本地仓库不能直接push到远程仓库,此时可以加-f强制push,但有风险

revert/reset

  • git revert id,revert只会影响指定id的commit记录,默认会提交一个新的commit,加上-n可以避免该默认行为;
  • git reset --hard id,Hard模式,指定id之后的所有commit记录都会丢失;
  • git reset,默认为Mixed模式,指定id之后的commit会放到暂存区;

注:revert后可以直接push,而reset后可能导致本地仓库与远程仓库不一致,须加上-f以强制push;

merge/rebase

  • git merge topic对当前分支和topic分支,以及它们的最近共同祖先,进行三方合并;
  • git rebase master topic将topic分支与master、topic的最近共同祖先进行比较,得到所有临时改动,并重新应用到master分支上;
  • git pull默认为fetch + merge;
  • git pull --rebase为fetch + rebase;

Fast-forward:当前分支是合并进来的分支的祖先节点,则二者之间不存在冲突,git直接移动Head指针到最新commit记录上,这称为快进;

注:merge和rebase的结果是相同的,但commit时间线不同,rebase是一条直线,且更简洁;

tag

  • 标签列表:git tag
  • 通配符匹配的标签列表:git tag -l 'v1.2*',-l可替换为–list;
  • 生成轻量标签:git tag tag-name
  • 生成附注标签:git tag -a tag-name -m '...',附注标签包含额外信息,且可被GNU Privacy Guard (GPG)签名、校验,以保证标签不被篡改;
  • 为指定commit生成标签:git tag tag-name commit-id
  • 删除标签:git tag -d tag-name
  • 推送标签:git push origin --tags

branch

  • 创建并切换分支:git checkout -b branch-name
  • 创建分支:git branch branch-name
  • 切换分支:git checkout branch-name
  • 删除分支:git branch -d branch-name