常用命令
# 查看工作区和暂存区的状态$ git status# 将工作区的文件提交到暂存区$ git add .# 提交到本地仓库$ git commit -m "本次提交说明"# add和commit的合并,便捷写法(未追踪的文件无法直接提交到暂存区/本地仓库)$ git commit -am "本次提交说明"# 将本地分支和远程分支进行关联$ git push -u origin branchName# 将本地仓库的文件推送到远程分支$ git push# 拉取远程分支的代码$ git pull origin branchName# 合并分支$ git merge branchName# 查看本地拥有哪些分支$ git branch# 查看所有分支(包括远程分支和本地分支)$ git branch -a# 切换分支$ git checkout branchName# 临时将工作区文件的修改保存至堆栈中$ git stash# 将之前保存至堆栈中的文件取出来$ git stash pop
status
# 查看工作区和暂存区的状态$ git status
add&rm
# 添加指定文件到暂存区(追踪新增的指定文件)【空格隔开】$ git add [file1] [file2] ...# 添加指定目录到暂存区,包括子目录$ git add [dir]# 添加当前目录的所有文件到暂存区(追踪所有新增的文件)$ git add .# 删除工作区/暂存区的文件【先add + commit过的文件,便可git rm git-test-2.txt】$ git rm [file1] [file2] ...# 停止追踪指定文件,但该文件会保留在工作区$ git rm --cached [file]# 改名工作区/暂存区的文件$ git mv [file-original] [file-renamed]
git add . :操作的对象是“当前目录”所有文件变更,”.” 表示当前目录。会监控工作区的状态树,使用它会把工作区的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件
commit
# 将暂存区的文件提交到本地仓库并添加提交说明$ git commit -m "本次提交的说明"# add 和 commit 的合并,便捷写法# 和 git add -u 命令一样,未跟踪的文件是无法提交上去的$ git commit -am "本次提交的说明"
pull&push
# 将本地仓库的文件推送到远程分支# 如果远程仓库没有这个分支,会新建一个同名的远程分支# 如果省略远程分支名,则表示两者同名$ git push <远程主机名> <本地分支名>:<远程分支名>$ git push origin branchname# 如果省略本地分支名,则表示删除指定的远程分支# 因为这等同于推送一个空的本地分支到远程分支。$ git push origin :master# 等同于$ git push origin --delete master# 建立当前分支和远程分支的追踪关系$ git push -u origin master# 如果当前分支与远程分支之间存在追踪关系# 则可以省略分支和 -u$ git push# 不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机$ git push --all origin# 拉取所有远程分支到本地镜像仓库中$ git pull# 拉取并合并项目其他人员的一个分支$ git pull origin branchname# 等同于 fetch + merge$ git fetch origin branchName$ git merge origin/branchName# 如果远程主机的版本比本地版本更新,推送时 Git 会报错,要求先在本地做 git pull 合并差异,# 然后再推送到远程主机。这时,如果你一定要推送,可以使用 –-force 选项# (尽量避免使用)$ git push --force origin | git push -f origin
branch
# 查看本地分支$ git branch | git branch -l# 查看远程分支$ git branch -r# 查看所有分支(本地分支+远程分支)$ git branch -a# 查看所有分支并带上最新的提交信息$ git branch -av# 查看本地分支对应的远程分支$ git branch -vv# 新建分支# 在别的分支下新建一个分支,新分支会复制当前分支的内容# 注意:如果当前分支有修改,但是没有提交到仓库,此时修改的内容是不会被复制到新分支的$ git branch branchname# 切换分支(切换分支时,本地工作区,仓库都会相应切换到对应分支的内容)$ git checkout branchname# 创建一个 test 分支,并切换到该分支 (新建分支和切换分支的简写)$ git checkout -b test# 可以看做是基于 master 分支创建一个 test 分支,并切换到该分支$ git checkout -b test master# 新建一条空分支(详情请看问题列表)$ git checkout --orphan emptyBranchName$ git rm -rf .# 删除本地分支,会阻止删除包含未合并更改的分支$ git brnach -d branchname# 强制删除一个本地分支,即使包含未合并更改的分支$ git branch -D branchname# 删除远程分支# 推送一个空分支到远程分支,其实就相当于删除远程分支$ git push origin :远程分支名# 或者$ git push origin --delete 远程分支名# 修改当前分支名$ git branch -m branchname
merge 三种常用合并方法
# 默认 fast-forward ,HEAD 指针直接指向被合并的分支$ git merge# 禁止快进式合并$ git merge --no-ff$ git merge --squash
log&reflog
# 查看提交记录$ git log#查看本地git命令的历史# 显示的是一个 HEAD 指向发生改变的时间列表$ git reflog
在切换分支、用 git commit 进行提交、以及用 git reset 撤销 commit 时,HEAD 指向会改变,但当你进行 git checkout —
- git reflog 不会永远保持,Git 会定期清理那些 “用不到的”对象,不要指望几个月前的提交还一直在那里。
remote
# 查看所有远程主机$ git remote# 查看关联的远程仓库的详细信息$ git remote -v# 删除远程仓库的 “关联”$ git remote rm projectname# 设置远程仓库的 “关联”$ git remote set-url origin <newurl>
tag
# 默认在 HEAD 上创建一个标签$ git tag v1.0# 指定一个 commit id 创建一个标签$ git tag v0.9 f52c633# 创建带有说明的标签,用 -a 指定标签名,-m 指定说明文字$ git tag -a v0.1 -m "version 0.1 released"# 查看所有标签# 注意:标签不是按时间顺序列出,而是按字母排序的。$ git tag# 查看单个标签具体信息$ git show <tagname># 推送一个本地标签$ git push origin <tagname># 推送全部未推送过的本地标签$ git push origin --tags# 删除本地标签# 因为创建的标签都只存储在本地,不会自动推送到远程。# 所以,打错的标签可以在本地安全删除。$ git tag -d v0.1# 删除一个远程标签(先删除本地 tag ,然后再删除远程 tag)$ git push origin :refs/tags/<tagname>
stash
- 能够将所有未提交的修改保存至堆栈中,用于后续恢复当前工作区内容
- 如果文件没有提交到暂存区(使用 git add . 追踪新的文件),使用该命令会提示 No local changes to save ,无法将修改保存到堆栈中
- 使用场景: 当你接到一个修复紧急 bug 的任务时候,一般都是先创建一个新的 bug 分支来修复它,然后合并,最后删除。但是,如果当前你正在开发功能中,短时间还无法完成,无法直接提交到仓库,这时候可以先把当前工作区的内容 git stash 一下,然后去修复 bug,修复后,再 git stash pop,恢复之前的工作内容。
# 将所有未提交的修改(提交到暂存区)保存至堆栈中$ git stash# 给本次存储加个备注,以防时间久了忘了$ git stash save "存储"# 存储未追踪的文件$ git stash -u# 查看存储记录$ git stash list在 Windows 上和 PowerShell 中,需要加双引号# 恢复后,stash 记录并不删除$ git stash apply "stash@{index}"# 恢复的同时把 stash 记录也删了$ git stash pop "stash@{index}"# 删除 stash 记录$ git stash drop "stash@{index}"# 删除所有存储的进度$ git stash clear# 查看当前记录中修改了哪些文件$ git stash show "stash@{index}"# 查看当前记录中修改了哪些文件的内容$ git stash show -p "stash@{index}"
checkout
# 恢复暂存区的指定文件到工作区$ git checkout <filename># 恢复暂存区的所有文件到工作区$ git checkout .# 回滚到最近的一次提交# 如果修改某些文件后,没有提交到暂存区,此时的回滚是回滚到上一次提交# 如果是已经将修改的文件提交到仓库了,这时再用这个命令回滚无效# 因为回滚到的是之前自己修改后提交的版本$ git checkout HEAD$ git checkout HEAD -- filename# 回滚到最近一次提交的上一个版本$ git checkout HEAD^# 回滚到最近一次提交的上2个版本$ git checkout HEAD^^# 切换分支,在这里也可以看做是回到项目「当前」状态的方式$ git checkout <当前你正在使用的分支># 切换到某个指定的 commit 版本$ git checkout <commit_id># 切换指定 tag$ git checkout <tag>
reset&revert
# 从暂存区撤销特定文件,但不改变工作区。它会取消这个文件的暂存,而不覆盖任何更改$ git reset <fileName># 重置暂存区最近的一次提交,但工作区的文件不变$ git reset# 等价于$ git reset HEAD (默认)# 重置暂存区与工作区,回退到最近一次提交的版本内容$ git reset --hard# 重置暂存区与工作区,回退到最近一次提交的上一个版本$ git reset --hard HEAD^# 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),同时重置暂存区,但工作区不变$ git reset <commit># 等价于$ git reset --mixed <commit># 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),但保持暂存区和工作区不变$ git reset --soft <commit># 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),同时重置暂存区、工作区$ git reset --hard <commit>
# 生成一个撤销最近的一次提交的新提交$ git revert HEAD# 生成一个撤销最近一次提交的上一次提交的新提交$ git revert HEAD^# 生成一个撤销最近一次提交的上两次提交的新提交$ git revert HEAD^^# 生成一个撤销最近一次提交的上n次提交的新提交$ git revert HEAD~num# 生成一个撤销指定提交版本的新提交$ git revert <commit_id># 生成一个撤销指定提交版本的新提交,执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息$ git revert <commit_id> --no-edit
- git reset:修改 HEAD 指向的位置
- git revert:还原某一个提交,并产生新提交来记录本次还原
创建git项目两张方式
本地新建好 Git 项目,然后关联远程仓库
# 初始化一个Git仓库
$ git init
# 关联远程仓库
$ git remote add <name> <git-repo-url>
# 例如
$ git remote add origin https://github.com/xxxxxx
clone 远程仓库
# 新建好远程仓库,然后 clone 到本地
$ git clone <git-repo-url>
# 将远程仓库下载到(当前 git bash 启动位置下面的)指定文件中,如果没有会自动生成
$ git clone <git-repo-url> <project-name>
开发经验
- 不小心把某些文件上传到远程 git 仓库/想要删除远程仓库中的文件
# 删除暂存区和工作区的文件
$ git rm filename
# 只删除暂存区的文件,不会删除工作区的文件
$ git rm --cached filename
如果在配置 .gitignore 文件之前就把某个文件上传到远程仓库了,这时候想把远程仓库中的该文件删除,此时你配置 .gitignore 文件也没有用,因为该文件已经被追踪了,但又不想在本地删除该文件后再重新提交到远程仓库,这时候可以使用 git rm —cached filename 命令取消该文件的追踪,这样下次提交的时候,git 就不会再提交这个文件,从而远程仓库的该文件也会被删除
- 查看 git 安装目录
- Mac: 在命令行中输入 which git,就会显示 git 的安装位置了
- Windows: 打开cmd,输入 where git,就会显示 git 的安装路径了
- 同时修改问题
