1. Git 基础
1.1. 仓库
1.1.1. 在现有项目中初始化仓库
git init # 初始化仓库
Changes to be committed: 已暂存状态
Changes not staged for commit: 已跟踪文件发生了变化,但没有放到暂存区
1.1.2. 克隆现有仓库
git clone [url] [local_name] # 会克隆每个文件的每个版本
1.1.3. 远程仓库
git remote # 列出指定的每一个远程服务器的简写 -v显示与其对应的 URLgit remote add <shortname> <url> # 添加一个新的远程 Git 仓库git fetch [remote-name] # 拉取远程仓库中你还没有的数据,不会自动合并|修改当前的工作git pull [remote-name] [remote-branch-name] # 自动的抓取并合并远程分支到当前分支git push [remote-name] [branch-name] # 推送数据git remote show [remote-name] # 命令列出了当你在特定的分支上执行 git push 会自动地推送到哪一个远程分支。 它也同样地列出了哪些远程分支不在你的本地,哪些远程分支已经从服务器上移除了,还有当你执行 git pull 时哪些分支会自动合并。git remote rm [remote-name] # 移除一个远程仓库
git clone会自动将其添加为远程仓库并默认以 “origin” 为简写
# 将本地已有的仓库推送到远程git remote add origin https://github.com/lulu27753/music_app.gitgit push -u origin master
1.2. gitignore 的格式规范
所有空行或以#开头的行都会被Git忽略
可以使用标准的glob模式匹配
匹配模式可以以(/)开头防止递归
匹配模式可以以(/)结尾指定目录
要忽略指定模式以外的文件和目录,可以在模式前加上(!)取反
简化的正则表达式:
(*) 匹配0或多个任意字符
[abc] 匹配任何一个列在方括号中的字符
(?) 只匹配一个任意字符
(-) 表示在这两个字符范围内的都可以匹配
() 匹配任意中间目录,比如`a//z
可以匹配 a/z, a/b/z 或a/b/c/z`等。
1.3. 记录更新
git status # 检查当前文件的状态 -s状态简览git diff # 查看未暂存的文件更新git diff --staged # 查看已暂存的文件更新git add *.c # 开始跟踪文件| 把已跟踪的文件放到暂存区 | 合并时把有冲突的文件标记为已解决git rm PROJECTS.md # 记录移除文件操作 -f强制删除在暂存区的文件 --cached 删除记录仅记录在暂存区,磁盘仍然保留文件git mv README.md README # 更改文件名字git commit -m 'initial project version' # 提交更新,-a跳过使用git add
1.4. 历史记录
git log # 按提交时间列出提交历史 -p显示每次提交的差异 --stat仅显示文件差异
1.5. 撤销
git clean -f # 删除 untracked filesgit clean -fd # 连 untracked 的目录也一起删掉git clean -xfd # 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)# 加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删git clean -nxfdgit clean -nfgit clean -nfd
git commit --amend # 第二次提交将代替第一次提交git reset HEAD <file> # 取消文件暂存git checkout -- <file> # 撤销文件修改
git reset HEAD^ --hardgit push -f [remote] [branch]
# Delete the most recent commit, keeping the work you've done:git reset --soft HEAD~1# Delete the most recent commit, destroying the work you've done:git reset --hard HEAD~1# 撤销(回退)某次commitgit revert commit_hash_id # (revert会产生一个新的commit,回退代码)# 撤销git add操作git rm --cache xxxx # 从暂存区删除,这个不会删除物理文件
临时仓库(stash)
git stashgit stash listgit stash applygit stash popgit 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. 打标签
git tag # 以字母顺序列出所有标签git tag -a v1.4 -m 'my version 1.4' # 创建附注标签 -m指定存储在标签中的信息git show [tag-name] # 显示所有的标签信息git push origin [tag-name] # 传送标签到远程仓库git push origin --tags # 把所有不在远程仓库服务器上的标签全部上传git checkout -b [branchname] [tagname] # 在特定的标签上创建一个新分支
1.7. 别名
git config --global alias.co checkoutgit config --global alias.br branchgit config --global alias.ci commitgit config --global alias.st statusgit config --global alias.unstage 'reset HEAD --'git config --global alias.last 'log -1 HEAD'git config --global alias.visual '!gitk'git config --global alias.vs '!gitk'
2. Git 分支
2.1. 本地分支管理
git branch [branch_name] # 创建分支git checkout [branch_name] # 切换分支git checkout -b [branch_name] #创建并切换分支git log --oneline --decorate # 查看各个分支当前所指的对象git checkout [branch_name] # 切换分支git log --oneline --decorate --graph --all # 输出提交历史、各个分支指向及项目的分支分叉情况git merge [branch_name] # 合并分支到当前分支git branch -d [branch_name] # 删除分支 -D强制删除git mergetool # 启动可视化合并工具git branch # 查看分支列表 -V查看每一个分支的最后一次提交 --merged查看已合并到当前分支的分支 --no-merged查看未合并的分支
2.2. 分支工作流(work silos)
- master: 保留完全稳定的代码——仅仅是已经发布或即将发布的代码
- develop(next): 后续开发或者测试稳定性——这些分支不必保持绝对稳定,但是一旦达到稳定状态,就可以被合并入 master 分支
- 特性分支(短期分支): 能够通过所有测试,并且不会引入更多 bug 之后,就可以合并入主干分支中,等待下一次的发布
- proposed(建议): 建议更新分支,它因包含一些不成熟的内容而不能进入develop分支,没有太大必要。
2.3. 远程分支管理
git remote show (remote_name) # 远程跟踪分支git fetch origin # 从origin抓取本地没有的数据,并更新本地数据库,移动 origin/master 指针指向更新后的位置git push [remote_name] [branch_name]:[remote_branch_name] # 将本地[branch_name]分支推送到有写入权限的远程仓库git checkout -b serverfix origin/serverfix # 会创建一个用于工作的本地分支serverfix,并且起点位于 origin/serverfixgit checkout --track origin/serverfix # 创建serverfix分支从origin/serverfix拉取数据git branch -u origin/serverfix # 修改正在跟踪的上游分支 -u即--set-upstream-togit branch -vv # 查看设置的所有跟踪分支git fetch --all # 抓取所有的远程仓库git push origin --delete serverfix # 删除远程分支serverfixgit push -f origin lbranch-3:refs/rbranch-1 # 用本地分支lbranch-3覆盖远程分支rbranch-1
设置远程地址的文件在.git目录下的config文件中
git remote rm origin # 删除远程地址git remote add origin [url] # 添加远程地址
git remote origin set-url [url] # 修改远程地址
2.4. Rebase(变基)
rebase将提交到某一分支上的所有修改都移至到另一分支上,就像“重新播放”.和merge的整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。
git checkout experiment // 检出到experiment分支git rebase master // 将experiment分支上的修改变基到master上git checkout master // 检出到master分支git merge experiment // 将master指针快进合并git rebase --onto master server client // 取出 client 分支,找出处于 client 分支和 server 分支的共同祖先之后的修改,然后把它们在 master 分支上重放一遍
只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作.
交互式rebase
git checkout featuregit rebase -i master // 把-i 传入git rebase 选项来开始一个交互式的rebase过程
会打开一个文本编辑器,显示所有将被移动的提交
项目管理
git diff --color [branchA] [branchB] > foo.diffgit diff //对比workspace与indexgit diff HEAD //对于workspace与最后一次commitgit diff <source_branch> <target_branch> //对比差异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/
