赞
踩
git首次配置用户信息:
- $ git config --global user.name "kequan"
- $ git config --global user.email kequanchan@qq.com
- $ git config --global credential store 配置 Git 以使用本地存储机制来缓存您的凭据(如用户名和密码),以便在与远程 Git 仓库交互时(如执行 git pull, git push 等操作)免去频繁手动输入这些凭据的步骤。
git 初始化仓库 和克隆
- $ cd 目标目录
- $ git init <project-name> 创建一个新的本地仓库(省略 project-name则在当前目录创建。)
-
- $ git clone <url> 克隆一个远程仓库。
git操作流程图:
为了更容易理解,可以先忽略 远程仓库,上图左侧操作基本在本地的一些操作。
git add <file>
添加一个文件到暂存区,比如git add .
就表示添加所有文件到暂存区
。
git commit -m "message”
提交所有暂存区
的文件到本地仓库
。
git commit -am "message”
提交所有已修改
的文件到本地仓库
。
git log
查看记录
git log --oneline
查看提交历史, --oneline表示简介模式。
git status
查看仓库状态, 列出还未提交的新的或修改的文件。
git diff
**查看unstaged状态的文件 ,**查看这次还没 add
(unstaged) 的修改部分 和上个已经 commit
的文件有何不同
git diff --cached
查看 staged文件,已经 add
了这次修改, 文件变成了 可提交状态 (staged)
git diff HEAD
查看 add
过 (staged) 和 没 add
(unstaged) 的修改
git diff <commit-id> <commit-id>
查看两个提交之间的差异。
git reset --hard 【HEAD or 位置ID】
使用reset回到某个节点
git checkout 位置ID -- 文件名
将 某文件 回到 位置ID 的节点
git branch
查看所有本地分支, 当前分支前面会有一个星号*
, -r
查看远程分支, -a
查看所有分支。
git branch <branch-name>
创建一个新的分支。
git checkout -b <branch-name>
切换到指定分支, 并更新工作区。
git branch -d <branch-name>
删除一个已经合并的分支。
git checkout -D <branch-name>
删除一个分支, 不管是否合并。
git tag <tag-name>
给当前的提交打上标签, 通常用于版本发布。
git log --oneline --graph
使用命令查看分支情况
git merge --no-ff -m message <branch-name>
合并分支, --no-ff参数表示禁用 Fast Forward模式, 合并后的历史有分支, 能看出曾经做过合并,
git merge --tt -m "message ‹branch-name>
而-ff参数表示使用 FastForward模式, 合并后的历史会变成一条直线。
合井&squash所有提交到一个提交 git merge -squash <branch-name>
rebase不会产生新的提交,而是把当前分支的每一个提交都 “复制“到目标分支上,然后再把当前分支指向目标分支,而merge会产生一个新的提交,这个提交有两个分支的所有修改。
Rebase操作可以把本地末push的分又提交历史整理成直线,看起来更直观。但是,如果多人协作时,不要对已经推送到远程的分支执行Rebase操作(不要在和别人协同开发时使用rebase操作,通常在自己的多个分支时使用rebase操作)
git checkout <dev>
git rebase ‹main> --continue
图示rebase过程:可以清楚看到,rebase将 两条分支合并成一条,没有创建新的节点C5,而是将A分支C3节点补充道B分支。
git mv <file> <new-file>
移动一个文件到新的位置。
git rm <file>
从工作区和暂存区删除一个文件, 并且将这次删除放入暂存区。
git rm --cached <file>
从索引 /暂存区中删除文件, 但是本地工作区文件还在, 只是不希望这个文件被版本控制。
git checkout <file> <commit-id>
恢复一个文件到之前的版本。
git revert <commit-id>
创建一个新的提交,用来撤销指定的提交, 原来的所有变化将被前者抵消, 并且应用到当前分支。
git reset --mixed <commit-id>
重置当前分支的 HEAD为之前的某个提交, 并且删除所有之后的提交。 --hard参数表示重置工作区和暂存区, --soft参数表示重置暂存区, --mixed参数表示重置工作区。
git restore --staged <file>
撤销暂存区的文件, 重新放回工作区(git add的反向操作)。
git stash save "message”
Stash操作可以把当前工作现场 “储藏” 起来, 等以后恢复现场后继续工作。
-u 参数表示把所有未跟踪的文件也一并存储; -a 参数表示把所有未跟踪的文件和忽略的文件也一并存储; save参数表示存储的信息, 可以不写。
git stash list
查看所有 stash。
git stash pop
恢复最近一次 stash。
git stash pop stash@{2}
恢复指定的 stash, stash@{2}表示第三个 stash, stash@{0}表示最近的 stash。
git stash apply
重新接受最近一次 stash。
git stash drop stash@{2}
pop和 apply的区别是, pop会把 stash内容删除,而 apply不会。 可以使用 git stash drop 来删除 stash。
git stash clear
删除所有 stash。
git remote add <remote-name> <remote-url>
添加远程仓库。
git remote -v
查看远程仓库。
git remote rm <remote-name>
删除远程仓库。
git remote rename <old-name> <new-name>
重命名远程仓库。
git pull <remote-name> <branch-name>
从远程仓库拉取代码。 默认拉取远程仓库名 origin的 master或者 main分支。
git pull --rebase
将本地改动的代码 rebase到远程仓库的最新代码上(为了有一个干净、 线性的提交历 史)。
git push <remote-name> <branch-name>
推送代码到远程仓库(然后再发起 pull request)。
git fetch <remote-name>
获取所有远程分支。
git branch -r
查看远程分支。
git fetch <remote-name> <branch-name>
Fetch某一个特定的远程分支。
GitFlow
GitFlow
是一种流程模型,用于在Git上管理软件开发项目。
主分支(**master/main**)
:代表了项目的稳定版本,每个提交到主分支的代码都应该是经过测试和审核的。
开发分支(**develop)
:用于日常开发。所有的功能分支、发布分支和修补分支都应该从开发分支派生出来。**
功能分支(**feature**)
:用于开发单独的功能或者特性。每个功能分支都应该从开发分支派生,并在开发完成后合并回开发分支。
发布分支(**release)
:用于准备项目发布。发布分支应该从开发分支派生,并在准备好发布版本后合并回主分支和开发分支。**
热修复分支(**hotfix**)
:用于修复主分支上的紧急问题。热修复分支应该从主分支派生,并在修复完成后,合并回主分支和开发分支。
commit
却发现在这个 commit
中忘了附上另一个文件。最后一个 commit
是 change 2
, 我们将要添加另外一个文件, 将这个修改也 commit
进 change 2
.
- $ git add 2.py
- $ git commit --amend --no-edit # "--no-edit": 不编辑, 直接合并到上一个 commit
- $ git log --oneline # "--oneline": 每个 commit 内容显示在一行
add
了修改, 但是又后悔, 并想补充一些内容再 add
- $ git add 1.py
- $ git status -s # "-s": status 的缩写模式
- # 输出
- M 1.py # staged
- -----------------------
- $ git reset 1.py
- # 输出
- Unstaged changes after reset:
- M 1.py
- -----------------------
- $ git status -s
- # 输出
- M 1.py # unstaged
使用reset 回退到指定节点:
- # 不管我们之前有没有做了一些 add 工作, 这一步让我们回到 上一次的 commit
- $ git reset --hard HEAD
- # 输出
- HEAD is now at 904e1ba change 2
- -----------------------
- # 看看所有的log
- $ git log --oneline
- # 输出
- 904e1ba change 2
- c6762a1 change 1
- 13be9a7 create 1.py
- -----------------------
- # 回到 c6762a1 change 1
- # 方式1: "HEAD^"
- $ git reset --hard HEAD^
-
- # 方式2: "commit id"
- $ git reset --hard c6762a1
- -----------------------
- # 看看现在的 log
- $ git log --oneline
- # 输出
- c6762a1 change 1
- 13be9a7 create 1.py
可以看到 change2 ,使用reflog查看最近的改动,并挽救之前的
- $ git reflog
- # 输出
- c6762a1 HEAD@{0}: reset: moving to c6762a1
- 904e1ba HEAD@{1}: commit (amend): change 2
- 0107760 HEAD@{2}: commit: change 2
- c6762a1 HEAD@{3}: commit: change 1
- 13be9a7 HEAD@{4}: commit (initial): create 1.py
重复 reset
步骤就能回到 commit (amend): change 2
(id=904e1ba)这一步了:
- $ git reset --hard 904e1ba
- $ git log --oneline
- # 输出
- 904e1ba change 2
- c6762a1 change 1
- 13be9a7 create 1.py
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。