1. Git 基础

1.1. 仓库

1.1.1. 在现有项目中初始化仓库

  1. git init # 初始化仓库
  • Changes to be committed: 已暂存状态

  • Changes not staged for commit: 已跟踪文件发生了变化,但没有放到暂存区

1.1.2. 克隆现有仓库

  1. git clone [url] [local_name] # 会克隆每个文件的每个版本

1.1.3. 远程仓库

  1. git remote # 列出指定的每一个远程服务器的简写 -v显示与其对应的 URL
  2. git remote add <shortname> <url> # 添加一个新的远程 Git 仓库
  3. git fetch [remote-name] # 拉取远程仓库中你还没有的数据,不会自动合并|修改当前的工作
  4. git pull [remote-name] [remote-branch-name] # 自动的抓取并合并远程分支到当前分支
  5. git push [remote-name] [branch-name] # 推送数据
  6. git remote show [remote-name] # 命令列出了当你在特定的分支上执行 git push 会自动地推送到哪一个远程分支。 它也同样地列出了哪些远程分支不在你的本地,哪些远程分支已经从服务器上移除了,还有当你执行 git pull 时哪些分支会自动合并。
  7. git remote rm [remote-name] # 移除一个远程仓库

git clone会自动将其添加为远程仓库并默认以 “origin” 为简写

  1. # 将本地已有的仓库推送到远程
  2. git remote add origin https://github.com/lulu27753/music_app.git
  3. git push -u origin master

1.2. gitignore 的格式规范

  • 所有空行或以#开头的行都会被Git忽略

  • 可以使用标准的glob模式匹配

  • 匹配模式可以以(/)开头防止递归

  • 匹配模式可以以(/)结尾指定目录

  • 要忽略指定模式以外的文件和目录,可以在模式前加上(!)取反

简化的正则表达式:

  • (*) 匹配0或多个任意字符

  • [abc] 匹配任何一个列在方括号中的字符

  • (?) 只匹配一个任意字符

  • (-) 表示在这两个字符范围内的都可以匹配

  • () 匹配任意中间目录,比如`a//z可以匹配 a/z, a/b/z 或a/b/c/z`等。

1.3. 记录更新

  1. git status # 检查当前文件的状态 -s状态简览
  2. git diff # 查看未暂存的文件更新
  3. git diff --staged # 查看已暂存的文件更新
  4. git add *.c # 开始跟踪文件| 把已跟踪的文件放到暂存区 | 合并时把有冲突的文件标记为已解决
  5. git rm PROJECTS.md # 记录移除文件操作 -f强制删除在暂存区的文件 --cached 删除记录仅记录在暂存区,磁盘仍然保留文件
  6. git mv README.md README # 更改文件名字
  7. git commit -m 'initial project version' # 提交更新,-a跳过使用git add

1.4. 历史记录

  1. git log # 按提交时间列出提交历史 -p显示每次提交的差异 --stat仅显示文件差异

1.5. 撤销

  1. git clean -f # 删除 untracked files
  2. git clean -fd # 连 untracked 的目录也一起删掉
  3. git clean -xfd # 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
  4. # 加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
  5. git clean -nxfd
  6. git clean -nf
  7. git clean -nfd
  1. git commit --amend # 第二次提交将代替第一次提交
  2. git reset HEAD <file> # 取消文件暂存
  3. git checkout -- <file> # 撤销文件修改
  1. git reset HEAD^ --hard
  2. git push -f [remote] [branch]
  1. # Delete the most recent commit, keeping the work you've done:
  2. git reset --soft HEAD~1
  3. # Delete the most recent commit, destroying the work you've done:
  4. git reset --hard HEAD~1
  5. # 撤销(回退)某次commit
  6. git revert commit_hash_id # (revert会产生一个新的commit,回退代码)
  7. # 撤销git add操作
  8. git rm --cache xxxx # 从暂存区删除,这个不会删除物理文件

临时仓库(stash)

  1. git stash
  2. git stash list
  3. git stash apply
  4. git stash pop
  5. git stash drop
  • stash 不小心被clear或者drop

    • git fsck —lost-found

    • 复制dangling commit 的id(其他的dangling blob不用理会)

    • git show [id]

    • 查看具体内容, 找到你想要的记录,记录中会描述日期和摘要,日期是你git stash 的日期, 摘要会记录你是在哪一条commit 上进行git stash操作的,

    • git merge [id]

1.6. 打标签

  1. git tag # 以字母顺序列出所有标签
  2. git tag -a v1.4 -m 'my version 1.4' # 创建附注标签 -m指定存储在标签中的信息
  3. git show [tag-name] # 显示所有的标签信息
  4. git push origin [tag-name] # 传送标签到远程仓库
  5. git push origin --tags # 把所有不在远程仓库服务器上的标签全部上传
  6. git checkout -b [branchname] [tagname] # 在特定的标签上创建一个新分支

1.7. 别名

  1. git config --global alias.co checkout
  2. git config --global alias.br branch
  3. git config --global alias.ci commit
  4. git config --global alias.st status
  5. git config --global alias.unstage 'reset HEAD --'
  6. git config --global alias.last 'log -1 HEAD'
  7. git config --global alias.visual '!gitk'
  8. git config --global alias.vs '!gitk'

2. Git 分支

2.1. 本地分支管理

  1. git branch [branch_name] # 创建分支
  2. git checkout [branch_name] # 切换分支
  3. git checkout -b [branch_name] #创建并切换分支
  4. git log --oneline --decorate # 查看各个分支当前所指的对象
  5. git checkout [branch_name] # 切换分支
  6. git log --oneline --decorate --graph --all # 输出提交历史、各个分支指向及项目的分支分叉情况
  7. git merge [branch_name] # 合并分支到当前分支
  8. git branch -d [branch_name] # 删除分支 -D强制删除
  9. git mergetool # 启动可视化合并工具
  10. git branch # 查看分支列表 -V查看每一个分支的最后一次提交 --merged查看已合并到当前分支的分支 --no-merged查看未合并的分支

2.2. 分支工作流(work silos)

  • master: 保留完全稳定的代码——仅仅是已经发布或即将发布的代码
  • develop(next): 后续开发或者测试稳定性——这些分支不必保持绝对稳定,但是一旦达到稳定状态,就可以被合并入 master 分支
  • 特性分支(短期分支): 能够通过所有测试,并且不会引入更多 bug 之后,就可以合并入主干分支中,等待下一次的发布
  • proposed(建议): 建议更新分支,它因包含一些不成熟的内容而不能进入develop分支,没有太大必要。

2.3. 远程分支管理

  1. git remote show (remote_name) # 远程跟踪分支
  2. git fetch origin # 从origin抓取本地没有的数据,并更新本地数据库,移动 origin/master 指针指向更新后的位置
  3. git push [remote_name] [branch_name]:[remote_branch_name] # 将本地[branch_name]分支推送到有写入权限的远程仓库
  4. git checkout -b serverfix origin/serverfix # 会创建一个用于工作的本地分支serverfix,并且起点位于 origin/serverfix
  5. git checkout --track origin/serverfix # 创建serverfix分支从origin/serverfix拉取数据
  6. git branch -u origin/serverfix # 修改正在跟踪的上游分支 -u即--set-upstream-to
  7. git branch -vv # 查看设置的所有跟踪分支
  8. git fetch --all # 抓取所有的远程仓库
  9. git push origin --delete serverfix # 删除远程分支serverfix
  10. git push -f origin lbranch-3:refs/rbranch-1 # 用本地分支lbranch-3覆盖远程分支rbranch-1

设置远程地址的文件在.git目录下的config文件中

  1. git remote rm origin # 删除远程地址
  2. git remote add origin [url] # 添加远程地址
  1. git remote origin set-url [url] # 修改远程地址

2.4. Rebase(变基)

rebase将提交到某一分支上的所有修改都移至到另一分支上,就像“重新播放”.和merge的整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。

  1. git checkout experiment // 检出到experiment分支
  2. git rebase master // experiment分支上的修改变基到master
  3. git checkout master // 检出到master分支
  4. git merge experiment // master指针快进合并
  5. git rebase --onto master server client // 取出 client 分支,找出处于 client 分支和 server 分支的共同祖先之后的修改,然后把它们在 master 分支上重放一遍

只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作.

交互式rebase

  1. git checkout feature
  2. git rebase -i master // 把-i 传入git rebase 选项来开始一个交互式的rebase过程

会打开一个文本编辑器,显示所有将被移动的提交

项目管理

  1. git diff --color [branchA] [branchB] > foo.diff
  2. git diff //对比workspaceindex
  3. git diff HEAD //对于workspace与最后一次commit
  4. git diff <source_branch> <target_branch> //对比差异
  5. git add <filename> //修改完冲突,需要add以标记合并成功

资源

CODING | 代码托管 项目管理 WebIDE 企业服务
码云 Gitee — 开源中国 Git 代码托管平台
Git Book
Git Flight Rule
Git教程™
Code-Guide
一款名为 Githug 的帮助练习 git 操作的游戏 https://github.com/Gazler/githug
图文并茂的 git 教程 https://backlog.com/git-tutorial/cn/
在线手动操作:https://learngitbranching.js.org/