Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
一、基本操作
命令 | 说明 |
---|
git init | 初始化一个版本库 | git add | 提交到暂存区,例如git add readme.txt | git commit | 提交到本地仓库,例如 git commit -m “wrote a readme file” | git status | 查看当前状态 | git status - s | 查看当前状态的精简信息 | git diff | 查看工作区与暂存区的文件差别,例如git diff readme.txt | git diff HEAD | 查看工作区与本地仓库的文件差别 | git diff --cached / git diff --staged | 查看暂存区与本地仓库的文件差别 | git log | 查看提交日志,展示commit id、提交时间以及提交message等 | git log --graph --pretty=oneline --abbrev-commit | –graph以图形化形式展示,可以方便查看分支的合并情况;–pretty=oneline 简化日志内容;–abbrev-commit 简化commit id | git rm <file> | 将文件从工作区和暂存区中删除 | git rm --cahched <file> | 将文件从暂存区中删除 |
二、版本回退
命令 | 说明 |
---|
git reset | 版本回退,将本地仓库回退到之前的版本,并使暂存区与本地仓库保持一致,工作区内容不变。例如git reset --hard HEAD^,HEAD^表示上一个版本,HEAD^^表示上上个版本,HEAD~100表示上100个版本 | git revert | 反向修改 | git reflog | 可以查到HEAD的所有变化记录,HEAD指向当前版本(当前的commit id) | git checkout – <file>或 git restore – worktree | 丢弃工作区的修改,撤回到最近一次add或commit的状态,例:git checkout – readme.txt,或者git restore readme.txt(–worktree是默认参数) | git reset HEAD <file>或 git restore --staged | 丢弃暂存区的修改,与本地仓库保持一致 | git restore --source=HEAD --staged --worktree <file> | 同时丢弃工作区和暂存区的修改,与本地仓库保持一致 |
reset与revert的区别在于:
reset:A->B->C,从C退到B,A->B,C版本丢失(当然也有办法找回)
revert:A->B->C,从C反向修改到B,A->B->C->B,C还在
用git reset从C退到B,再用git log,发现日志少了一个,此时如果想穿越到C,只要记得C的commit id,使用git reset,把后面的HEAD替换成commit id即可,如果不记得,可以使用git reflog命令,找到你要穿越到的commit id。
三、远程仓库
命令 | 说明 |
---|
git remote add origin <url> | 添加远程仓库,origin是远程仓库的标识,可以随便起 | git remote -v | 查看远程仓库信息,-v查看详细信息 | git remote rm origin | 解除本地和远程仓库origin的关联 | git clone | 克隆远程仓库 | git pull <远程主机> <远程分支>:<本地分支> | 将远程分支合并到本地分支,发生冲突的解决方法与分支管理的解决冲突一样 | git push <远程主机> <本地分支>:<远程分支> | 把本地分支的所有提交推送到远程分支并合并,远程分支和本地分支名相同时可简写,例:git push origin master |
四、分支管理
命令 | 说明 |
---|
git branch | 列出所有分支,并在当前分支前标一个
?
*
?号 | git branch <branch> | 创建分支 | git checkout <branch> 或 git switch <branch> | 切换分支 | git checkout -b <branch> 或 git switch -c <branch> | 创建新分支并切换到该分支 | git branch -d <branch> | 删除分支 | git branch -D <branch> | 强行删除一个没有合并过的分支 | git merge <branch> | 将指定分支合并到当前分支中,<branch>为可选参数,默认为所有分支 | git merge --no-ff -m <message> <branch> | 合并时强制禁止Fast forward模式 | git switch -c dev origin/dev | 从远程origin/dev分支创建本地分支dev并切换到该分支 | git branch --set-upstream-to=origin/dev dev | 指定本地dev分支与远程origin/dev分支的链接 | git push origin --delete 分支名 | 删除远程分支 |
4.1 简单的现象
发现个现象:在testing分支修改了同一个文件,在切换回master之前,如果没有add commit,在master分支能看到testing分支的修改,但是如果add commit了的话,看不到。
4.2 合并冲突
当发生合并冲突时,需要手动修改,然后add+commit,如果没有冲突,则不需要add+commit。
合并冲突的可能情况如下,其中master和dev合并时发生冲突,需要手动修改,然后提交,E是一个新的提交点:
未发生合并冲突的可能情况如下:
4.3 强制禁止Fast forward模式
在合并分支时,如果没有发生冲突,Git会采用Fast forward模式(参考上图),这样在log中看不出来曾经做过合并,如果强制禁用Fast forward模式,就会在merge时生成一个新的commit,这样,在分支历史上就可以看到合并信息。
五、临时存储
命令 | 说明 |
---|
git stash | 临时存储当前分支的工作现场 | git stash list | 列出所有临时存储的工作现场 | git stash apply <stash> | 恢复工作现场,但是不删除stash内容 | git stash drop | 删除stash内容 | git stash pop | 恢复工作现场,并删除stash内容 |
应用场景:你正在dev上面开发,但是突然发现master上面有个bug,你当前工作只进行到一半,还不能提交,你用git stash临时存储dev的工作现场,切换到master,然后创建个新分支issue-101用于改bug,改完bug提交,然后合并到master上,删除issue-101分支,ok,你切换到dev打算继续干活,用git stash pop恢复了现场。
但是,你想了想,dev分支上好像也有这个bug,你用git cherry-pick <commit>把之前改bug所做的commit复制过来,相当于在dev上做了一次一摸一样的提交(提交内容相同,但id不同),这样dev上也改好了这个bug,不用重复操作了。
六、标签管理
命令 | 说明 |
---|
git tag | 查看所有标签 | git tag <tag> <commit id> | 创建一个新标签,默认对当前分支的最新commit打标签,若给定commit id,则在指定commit上打标签 | git tag -a <tag> -m <message> <commit id> | 创建带有说明的标签,-a指定标签名,-m指定说明文字 | git show <tag> | 查看标签信息 | git push origin <tag> | 将指定标签推送到远程仓库 | git push origin --tags | 将所有标签推送到远程仓库 | git tag -d <tag> | 删除本地仓库的标签 | git push origin -d tag <tag> | 删除远程仓库的标签 |
参考资料:
Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
Git 教程 | 菜鸟教程 (runoob.com)
|