Git备忘心得 - 图2常用命令

  1. # 查看工作区和暂存区的状态
  2. $ git status
  3. # 将工作区的文件提交到暂存区
  4. $ git add .
  5. # 提交到本地仓库
  6. $ git commit -m "本次提交说明"
  7. # add和commit的合并,便捷写法(未追踪的文件无法直接提交到暂存区/本地仓库)
  8. $ git commit -am "本次提交说明"
  9. # 将本地分支和远程分支进行关联
  10. $ git push -u origin branchName
  11. # 将本地仓库的文件推送到远程分支
  12. $ git push
  13. # 拉取远程分支的代码
  14. $ git pull origin branchName
  15. # 合并分支
  16. $ git merge branchName
  17. # 查看本地拥有哪些分支
  18. $ git branch
  19. # 查看所有分支(包括远程分支和本地分支)
  20. $ git branch -a
  21. # 切换分支
  22. $ git checkout branchName
  23. # 临时将工作区文件的修改保存至堆栈中
  24. $ git stash
  25. # 将之前保存至堆栈中的文件取出来
  26. $ git stash pop

status

  1. # 查看工作区和暂存区的状态
  2. $ git status

add&rm

  1. # 添加指定文件到暂存区(追踪新增的指定文件)【空格隔开】
  2. $ git add [file1] [file2] ...
  3. # 添加指定目录到暂存区,包括子目录
  4. $ git add [dir]
  5. # 添加当前目录的所有文件到暂存区(追踪所有新增的文件)
  6. $ git add .
  7. # 删除工作区/暂存区的文件【先add + commit过的文件,便可git rm git-test-2.txt】
  8. $ git rm [file1] [file2] ...
  9. # 停止追踪指定文件,但该文件会保留在工作区
  10. $ git rm --cached [file]
  11. # 改名工作区/暂存区的文件
  12. $ git mv [file-original] [file-renamed]

git add .操作的对象是“当前目录”所有文件变更,”.” 表示当前目录。会监控工作区的状态树,使用它会把工作区的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件

commit

  1. # 将暂存区的文件提交到本地仓库并添加提交说明
  2. $ git commit -m "本次提交的说明"
  3. # add 和 commit 的合并,便捷写法
  4. # 和 git add -u 命令一样,未跟踪的文件是无法提交上去的
  5. $ git commit -am "本次提交的说明"

pull&push

  1. # 将本地仓库的文件推送到远程分支
  2. # 如果远程仓库没有这个分支,会新建一个同名的远程分支
  3. # 如果省略远程分支名,则表示两者同名
  4. $ git push <远程主机名> <本地分支名>:<远程分支名>
  5. $ git push origin branchname
  6. # 如果省略本地分支名,则表示删除指定的远程分支
  7. # 因为这等同于推送一个空的本地分支到远程分支。
  8. $ git push origin :master
  9. # 等同于
  10. $ git push origin --delete master
  11. # 建立当前分支和远程分支的追踪关系
  12. $ git push -u origin master
  13. # 如果当前分支与远程分支之间存在追踪关系
  14. # 则可以省略分支和 -u
  15. $ git push
  16. # 不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机
  17. $ git push --all origin
  18. # 拉取所有远程分支到本地镜像仓库中
  19. $ git pull
  20. # 拉取并合并项目其他人员的一个分支
  21. $ git pull origin branchname
  22. # 等同于 fetch + merge
  23. $ git fetch origin branchName
  24. $ git merge origin/branchName
  25. # 如果远程主机的版本比本地版本更新,推送时 Git 会报错,要求先在本地做 git pull 合并差异,
  26. # 然后再推送到远程主机。这时,如果你一定要推送,可以使用 –-force 选项
  27. # (尽量避免使用)
  28. $ git push --force origin | git push -f origin

branch

  1. # 查看本地分支
  2. $ git branch | git branch -l
  3. # 查看远程分支
  4. $ git branch -r
  5. # 查看所有分支(本地分支+远程分支)
  6. $ git branch -a
  7. # 查看所有分支并带上最新的提交信息
  8. $ git branch -av
  9. # 查看本地分支对应的远程分支
  10. $ git branch -vv
  11. # 新建分支
  12. # 在别的分支下新建一个分支,新分支会复制当前分支的内容
  13. # 注意:如果当前分支有修改,但是没有提交到仓库,此时修改的内容是不会被复制到新分支的
  14. $ git branch branchname
  15. # 切换分支(切换分支时,本地工作区,仓库都会相应切换到对应分支的内容)
  16. $ git checkout branchname
  17. # 创建一个 test 分支,并切换到该分支 (新建分支和切换分支的简写)
  18. $ git checkout -b test
  19. # 可以看做是基于 master 分支创建一个 test 分支,并切换到该分支
  20. $ git checkout -b test master
  21. # 新建一条空分支(详情请看问题列表)
  22. $ git checkout --orphan emptyBranchName
  23. $ git rm -rf .
  24. # 删除本地分支,会阻止删除包含未合并更改的分支
  25. $ git brnach -d branchname
  26. # 强制删除一个本地分支,即使包含未合并更改的分支
  27. $ git branch -D branchname
  28. # 删除远程分支
  29. # 推送一个空分支到远程分支,其实就相当于删除远程分支
  30. $ git push origin :远程分支名
  31. # 或者
  32. $ git push origin --delete 远程分支名
  33. # 修改当前分支名
  34. $ git branch -m branchname

merge 三种常用合并方法

  1. # 默认 fast-forward ,HEAD 指针直接指向被合并的分支
  2. $ git merge
  3. # 禁止快进式合并
  4. $ git merge --no-ff
  5. $ git merge --squash

log&reflog

  1. # 查看提交记录
  2. $ git log
  3. #查看本地git命令的历史
  4. # 显示的是一个 HEAD 指向发生改变的时间列表
  5. $ git reflog

在切换分支、用 git commit 进行提交、以及用 git reset 撤销 commit 时,HEAD 指向会改变,但当你进行 git checkout — 撤销或者 git stash 存储文件等操作时,HEAD 并不会改变,这些修改从来没有被提交过,因此 reflog 也无法帮助我们恢复它们。

  • git reflog 不会永远保持,Git 会定期清理那些 “用不到的”对象,不要指望几个月前的提交还一直在那里。

remote

  1. # 查看所有远程主机
  2. $ git remote
  3. # 查看关联的远程仓库的详细信息
  4. $ git remote -v
  5. # 删除远程仓库的 “关联”
  6. $ git remote rm projectname
  7. # 设置远程仓库的 “关联”
  8. $ git remote set-url origin <newurl>

tag

  1. # 默认在 HEAD 上创建一个标签
  2. $ git tag v1.0
  3. # 指定一个 commit id 创建一个标签
  4. $ git tag v0.9 f52c633
  5. # 创建带有说明的标签,用 -a 指定标签名,-m 指定说明文字
  6. $ git tag -a v0.1 -m "version 0.1 released"
  7. # 查看所有标签
  8. # 注意:标签不是按时间顺序列出,而是按字母排序的。
  9. $ git tag
  10. # 查看单个标签具体信息
  11. $ git show <tagname>
  12. # 推送一个本地标签
  13. $ git push origin <tagname>
  14. # 推送全部未推送过的本地标签
  15. $ git push origin --tags
  16. # 删除本地标签
  17. # 因为创建的标签都只存储在本地,不会自动推送到远程。
  18. # 所以,打错的标签可以在本地安全删除。
  19. $ git tag -d v0.1
  20. # 删除一个远程标签(先删除本地 tag ,然后再删除远程 tag)
  21. $ git push origin :refs/tags/<tagname>

stash

  • 能够将所有未提交的修改保存至堆栈中,用于后续恢复当前工作区内容
  • 如果文件没有提交到暂存区(使用 git add . 追踪新的文件),使用该命令会提示 No local changes to save ,无法将修改保存到堆栈中
  • 使用场景: 当你接到一个修复紧急 bug 的任务时候,一般都是先创建一个新的 bug 分支来修复它,然后合并,最后删除。但是,如果当前你正在开发功能中,短时间还无法完成,无法直接提交到仓库,这时候可以先把当前工作区的内容 git stash 一下,然后去修复 bug,修复后,再 git stash pop,恢复之前的工作内容。
  1. # 将所有未提交的修改(提交到暂存区)保存至堆栈中
  2. $ git stash
  3. # 给本次存储加个备注,以防时间久了忘了
  4. $ git stash save "存储"
  5. # 存储未追踪的文件
  6. $ git stash -u
  7. # 查看存储记录
  8. $ git stash list
  9. Windows 上和 PowerShell 中,需要加双引号
  10. # 恢复后,stash 记录并不删除
  11. $ git stash apply "stash@{index}"
  12. # 恢复的同时把 stash 记录也删了
  13. $ git stash pop "stash@{index}"
  14. # 删除 stash 记录
  15. $ git stash drop "stash@{index}"
  16. # 删除所有存储的进度
  17. $ git stash clear
  18. # 查看当前记录中修改了哪些文件
  19. $ git stash show "stash@{index}"
  20. # 查看当前记录中修改了哪些文件的内容
  21. $ git stash show -p "stash@{index}"

checkout

  1. # 恢复暂存区的指定文件到工作区
  2. $ git checkout <filename>
  3. # 恢复暂存区的所有文件到工作区
  4. $ git checkout .
  5. # 回滚到最近的一次提交
  6. # 如果修改某些文件后,没有提交到暂存区,此时的回滚是回滚到上一次提交
  7. # 如果是已经将修改的文件提交到仓库了,这时再用这个命令回滚无效
  8. # 因为回滚到的是之前自己修改后提交的版本
  9. $ git checkout HEAD
  10. $ git checkout HEAD -- filename
  11. # 回滚到最近一次提交的上一个版本
  12. $ git checkout HEAD^
  13. # 回滚到最近一次提交的上2个版本
  14. $ git checkout HEAD^^
  15. # 切换分支,在这里也可以看做是回到项目「当前」状态的方式
  16. $ git checkout <当前你正在使用的分支>
  17. # 切换到某个指定的 commit 版本
  18. $ git checkout <commit_id>
  19. # 切换指定 tag
  20. $ git checkout <tag>

reset&revert

  1. # 从暂存区撤销特定文件,但不改变工作区。它会取消这个文件的暂存,而不覆盖任何更改
  2. $ git reset <fileName>
  3. # 重置暂存区最近的一次提交,但工作区的文件不变
  4. $ git reset
  5. # 等价于
  6. $ git reset HEAD (默认)
  7. # 重置暂存区与工作区,回退到最近一次提交的版本内容
  8. $ git reset --hard
  9. # 重置暂存区与工作区,回退到最近一次提交的上一个版本
  10. $ git reset --hard HEAD^
  11. # 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),同时重置暂存区,但工作区不变
  12. $ git reset <commit>
  13. # 等价于
  14. $ git reset --mixed <commit>
  15. # 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),但保持暂存区和工作区不变
  16. $ git reset --soft <commit>
  17. # 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),同时重置暂存区、工作区
  18. $ git reset --hard <commit>
  1. # 生成一个撤销最近的一次提交的新提交
  2. $ git revert HEAD
  3. # 生成一个撤销最近一次提交的上一次提交的新提交
  4. $ git revert HEAD^
  5. # 生成一个撤销最近一次提交的上两次提交的新提交
  6. $ git revert HEAD^^
  7. # 生成一个撤销最近一次提交的上n次提交的新提交
  8. $ git revert HEAD~num
  9. # 生成一个撤销指定提交版本的新提交
  10. $ git revert <commit_id>
  11. # 生成一个撤销指定提交版本的新提交,执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息
  12. $ 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>

开发经验

  1. 不小心把某些文件上传到远程 git 仓库/想要删除远程仓库中的文件
# 删除暂存区和工作区的文件
$ git rm filename  
# 只删除暂存区的文件,不会删除工作区的文件
$ git rm --cached filename

如果在配置 .gitignore 文件之前就把某个文件上传到远程仓库了,这时候想把远程仓库中的该文件删除,此时你配置 .gitignore 文件也没有用,因为该文件已经被追踪了,但又不想在本地删除该文件后再重新提交到远程仓库,这时候可以使用 git rm —cached filename 命令取消该文件的追踪,这样下次提交的时候,git 就不会再提交这个文件,从而远程仓库的该文件也会被删除

  1. 查看 git 安装目录
  • Mac: 在命令行中输入 which git,就会显示 git 的安装位置了
  • Windows: 打开cmd,输入 where git,就会显示 git 的安装路径了
  1. 同时修改问题
如果两个人都对某个文件进行了修改,一个对文件重命名,一个修改内容,那么会起冲突吗?答:git 很机智,会自动合并这些修改 如果两个人都对同一个文件重命名,此时会起冲突,git 不会自动处理,需要开发者自身去解决冲突