配置 Git
#查看配置信息
git config --global --list
git config --global user.name "Your Name"
git config --global user.email "youremail@example.com"
初始化Git 仓库
git init
git clone https://github.com/username/repository.git
git remote -v
#添加远程仓库地址ssh or http/https
git remote add gitName gitPath
基础工作流
#查看文件状态
git status
#将文件添加到暂存区
git add <filename>
#将全部文件添加到暂存区
git add .
#提交更改
git commit -m "Commit message"
#将本地更改推送到远程仓库
git push origin main
分支(Branch)管理
#查看所有分支
git branch
#创建新分支
git branch <branchname>
#新建分支
git checkout -b <new-branch-name>
#基于远程分支 新建本地分支
git checkout -b <new-branch-name> origin/<new-branch-name>
#切换分支
git checkout <branchname>
#合并分支
git merge <branchname>
#删除分支
git branch -d <branch-name>
#强制删除分支
git branch -D <branch-name>
#删除远程分支
git push origin --delete <branch-name>
更新与合并
#拉取远程分支,不merge
git fetch
#拉取远程分支 进行merge操作
git pull
#合并其他分支到你的当前分支
git merge <branchname>
git merge --continue
git merge --abort
#查看文件差异
git diff <source_branch> <target_branch>
Push
#推送分支到远程仓库
git push
#推送本地分支到远程仓库分支
git push branchName origin_branchName
#强制推送--force
git push -f origin branchName
#将本地分支push到远程remote仓库,多个仓库添加gitName区分,gitName指向gitPath
git push gitName --all
#本地和远程分支存在非fast-forward,基不一样
#允许远程分支历史版本合并,将本地和远程基合并,存在两个parent
git merge --allow-unrelated-histroys gitName/master
分支Diff
#两个分支diff
git diff branch1 branch2
#两个分支中某个文件diff
git diff branch1 branch2 -- fileName
#可以用commit_id 替换分支
git diff commit_id1 commit_id2 -- fileName
合并提交
#修改最近一次提交message
git commit --amend
#修改历史提交的commit message,此处commit id是需要修改提交信息的上一次提交
#弹出rebase 信息框,修改对应的commit id,将pick改为改为r或者reword,修改对应的message描述即可
git rebase -i 4adc51c
git merge
#合并远程分支
git merge origin/branch
#忽略本次merge
git merge --abort
#merge 后提交一次
git commit -am 'msg'
#基于master变基
git rebase master
#基于master变基 合并提交
git rebase master -i
#批量将pick 修改为squash
:%s/pick/squash/g
git rebase --continue
git rebase --abort
回滚更改
#撤销工作目录中所有未提交文件的修改
git checkout .
#将文件回滚到上一个提交的状态
git checkout <commit_hash> <filename>
#重置暂存区与工作目录,匹配最近一次的 commit
git reset --hard
#删除最近几次提交
git reset --hard 4adc51c
查看提交历史
#查看提交历史
git log
#查看特定文件的变更历史
git log -p <filename>
#查看简洁的提交历史
git log --pretty=oneline
#最近4次,一行展示,图形化展示
git log -n4 --oneline --graph
#查看提交类型
git cat-file -t 4adc51c
#查看提交的父提交
git cat-file -p 4adc51c
暂存区
Git 暂存区(Staging Area,也有时被称为“索引”)是 Git 版本控制系统的一个非常强大和独特的特性,它允许开发者在最终提交改动到仓库之前,对即将提交的文件和更改进行精细的审查和修改。
暂存区位于工作目录(你正在工作的文件夹)和仓库(项目的历史记录所在地)之间。
#暂存区和head diff
git diff --cached
#工作区和暂存区diff
git diff
#工作区和暂存区某个文件diff
git diff -- fileNme
#让暂存区恢复和head一致
git reset HEAD
git reset --hard HEAD
#让暂存区某个文件恢复和head一致
git reset HEAD -- fileName
#让工作区恢复和暂存区一致
git checkout -- fileName
stash
用于查看工作目录的状态,显示已修改、未跟踪等文件的信息。
该命令会列出已暂存和未暂存的变更,以及未被Git跟踪的文件。这可以帮助您了解当前工作目录中的变更情况
git status
#将当前工作目录中的临时变更(尚未提交)暂存起来,使其回到一个干净的工作目录状态,方便切换到其他分支或进行其他操作。
git stash
#查看已经暂存的内容列表
git stash list
git status
#可以将最近的暂存内容重新应用到工作目录中
git stash apply
#应用的同时删除该stash
git stash pop
rerere工具
#解决rebase 多次处理冲突的问题
git config --global rerere.enabled true
git merger master
#处理冲突
vim file
#提交工作区
git add file
git log
#本次操作会产生一次commit id
git commit -am 'temp'
git log
#回滚产生的temp commit id (HEAD~1 头指针的父指针)
git reset --hard HEAD~1
gitignore
doc: 这个规则表示忽略所有名为“doc”的文件或目录,无论其位于什么位置。
doc/: 这个规则表示忽略名为“doc”的目录,但不会忽略同名的文件。它只匹配“doc”这个目录,而不包括子目录。
/doc: 这个规则表示从根目录开始,忽略名为“doc”的目录或文件。它指定了路径是相对于根目录(工作树)的,而不是相对于当前.gitignore文件所在的目录。这将确保只有根目录下的“doc”会被忽略,而子目录中的“doc”不会被忽略。
更有趣的变基例子
在对两个分支进行变基时,所生成的“重放”并不一定要在目标分支上应用,你也可以指定另外的一个分支进行应用。 就像 从一个主题分支里再分出一个主题分支的提交历史 中的例子那样。 你创建了一个主题分支 server,为服务端添加了一些功能,提交了 C3 和 C4。 然后从 C3 上创建了主题分支 client,为客户端添加了一些功能,提交了 C8 和 C9。 最后,你回到 server 分支,又提交了 C10。
Figure 39. 从一个主题分支里再分出一个主题分支的提交历史
假设你希望将 client 中的修改合并到主分支并发布,但暂时并不想合并 server 中的修改, 因为它们还需要经过更全面的测试。这时,你就可以使用 git rebase 命令的 --onto 选项, 选中在 client 分支里但不在 server 分支里的修改(即 C8 和 C9),将它们在 master 分支上重放:
$ git rebase --onto master server client
以上命令的意思是:“取出 client 分支,找出它从 server 分支分歧之后的补丁, 然后把这些补丁在 master 分支上重放一遍,让 client 看起来像直接基于 master 修改一样”。这理解起来有一点复杂,不过效果非常酷。
Figure 40. 截取主题分支上的另一个主题分支,然后变基到其他分支
现在可以快进合并 master 分支了。(如图 快进合并master分支,使之包含来自client分支的修改):
$ git checkout master
$ git merge client
Figure 41. 快进合并 master 分支,使之包含来自 client 分支的修改
接下来你决定将 server 分支中的修改也整合进来。 使用 git rebase <basebranch> <topicbranch> 命令可以直接将主题分支 (即本例中的 server)变基到目标分支(即 master)上。 这样做能省去你先切换到 server 分支,再对其执行变基命令的多个步骤。
$ git rebase master server
如图 将server中的修改变基到master上 所示,server 中的代码被“续”到了 master 后面
Figure 42. 将 server 中的修改变基到 master 上
然后就可以快进合并主分支 master 了:
$ git checkout master
$ git merge server
至此,client 和 server 分支中的修改都已经整合到主分支里了, 你可以删除这两个分支,最终提交历史会变成图 最终的提交历史 中的样子
$ git branch -d client
$ git branch -d server