重新复习整理Git的使用说明,以及在实际工作中用到的一些,以及不常用的一些命令。笔者工作中,更多的时候是用IDEA的可视化快捷命令进行git管理。本文内容以及示意图主要参考Git中文指南 。感谢译者!
一. git使用原理
1.1 三种状态
工作流:工作区--add---> 暂存区 --commit----> 本地仓库--push-->远程仓库
1.2 状态切换
个人理解:一个新建的文件( untracker) 通过 add
变成 staged,同时也是(tracked)。然后commit
到仓库中。之后它状态为(Unmodified)。之后会被编辑(Modified),对于这个被修改后的版本,同样需要 add
到 staged状态。等待下一次的 commit
。
二. 基础命令
安装配置git软件
首先在Windows环境下安装git软件,参考 起步-安装。然后是配置,比如编辑你在github上面的账号和邮箱,参考配置。
# 获取帮助命令
git help
git add -h
2.1 新建本地仓库
新建:对于一个已经存在的项目,当你想对其进行版本控制,首先建立该项目的本地仓库,在该项目所在的目录下输入
# 该命令将创建一个名为 .git 的子目录,同时创建一个本地仓库
git init
# 将追踪该目录下所有文件或指定文件
git add -A
git add *.c
git add readme.txt
git add 命令。 这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“精确地将内容添加到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。
克隆:从远程仓库(github,Gitee,Gitlab)中拉一个项目的代码
# 在当前目录下就会新建一个 itstack-demo-design 目录
git clone https://github.com/fuzhengwei/itstack-demo-design.git
# 指定目录下
git clone https://github.com/fuzhengwei/itstack-demo-design.git myProject/
2.2 日常操作
① git status 查看文件状态
如果在克隆仓库后立即使用此命令,会看到类似这样的输出:
$ git status
On branch master Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
这说明你现在的工作目录非常干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。 此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来。 最后,该命令还显示了当前所在分支,并告诉你这个分支同远程服务器上对应的分支没有偏离。 现在,分支名是“master”,这是默认的分支名。
② 忽略文件(黑名单)
有些文件不需要被追踪,所以可以创建 .gitignore文件来列出过滤名单,详见参考
③ git diff 查看区别
想知道具体修改了什么地方,可以用 git diff 命令。 稍后我们会详细介绍 git diff,你通常可能会用它来回答这两个问题:当前做的哪些更新尚未暂存? 有哪些更新已暂存并准备好下次提交?
//此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。
//也就是修改之后还没有暂存起来的变化内容
git diff
// 比对已暂存文件与最后一次提交的文件差异
git diff --staged/--cached
//例如下面例子说明:newfile4.txt从空文件添加了一二两行的数据,从 @@ -0,0 +1,2 @@ 看得出
$ git diff
diff --git a/newfile4.txt b/newfile4.txt
index e69de29..da5a12a 100644
--- a/newfile4.txt
+++ b/newfile4.txt
@@ -0,0 +1,2 @@
+delete first line
+add second line
\ No newline at end of file
// 下面例子说明:newfile4.txt,删除了第1,2两行,然后又增加1,2行,从 @@ -1,2 +1 @@看得出
$ git diff
diff --git a/newfile4.txt b/newfile4.txt
index da5a12a..264d731 100644
--- a/newfile4.txt
+++ b/newfile4.txt
@@ -1,2 +1 @@
-delete first line
-add second line
\ No newline at end of file
+add three line
\ No newline at end of file
在每次 commit
前,需要 先 git status
查看一下所需要的文件是不是都已暂存起来了。
④ git commit 提交
git commit - m 'first-commit'
//在提交的时候,给 git commit 加上 -a 选项,
Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,
从而跳过 git add 步骤
git commit -a -m 'commit without add'
⑤ git rm 移除文件
将文件移除追踪,从已跟踪文件清单中移除(确切地说,是从暂存区域移除),有四种方式:
git rm file
:直接移除出跟踪清单,并且从工作目录中删除;- 手动删除文件,再
git rm
; - 要删除之前修改过或已经放到暂存区的文件,
git rm -f
; - 想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪,
git rm --cached readme.txt
,如果文件多了,可以使用通配符批量匹配。
⑥ git mv 重命名文件
git mv file1 file2
⑦ 撤销
修补提交(替换提交)
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交:
- git commit --amend -m "additional commit"
这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而你所修改的只是提交信息。
实际例子:
你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:
git commit -m 'initial commit'
git add forgotten_file
git commit --amend -m 'initial commit'
最终你只会有一个提交——第二次提交将代替第一次提交的结果
取消暂存的提交
你已经修改了两个文件并且想要将它们作为两次独立的修改提交, 但是却意外地输入 git add * 暂存了它们两个。如何只取消暂存两个中的一个呢? git status 命令提示了你
git add *
git status
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
// 取消暂存的CONTRIBUTING.md
git reset HEAD CONTRIBUTING.md
// 也可以取消最近一次的提交
git reset HEAD~1
git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
当我又想撤销刚刚的reset操作,如何做呢?,使用 git reflog
来查看所有重要操作记录。
可以看到在reset操作之前的Head 哈希值是 4afedbc。所以
git reset --hard 4afedbc
完成。
撤销对文件的修改
如果你并不想保留对 CONTRIBUTING.md 文件的修改怎么办? 你该如何方便地撤消修改——将它还原成上次提交时的样子 。请务必记得 git checkout --
是一个危险的命令。 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。 除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。
// 此时 CONTRIBUTING.md已经被修改,但是没有add,想恢复到上一次提交的样子
git checkout -- CONTRIBUTING.md
git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
2.3 关联远程仓库
新建一个和 本地仓库所在的目录名称一样的仓库,然后添加仓库。
// origin是仓库别名,代替后面的URL
git remote add origin https://github.com/taotao0501/testGit.git
// 查看可用的仓库列表,fetch表示 可拉取,push表示可推送
git remote -v
origin https://github.com/taotao0501/i18n.git (fetch)
origin https://github.com/taotao0501/i18n.git (push)
//推送到 origin对应的url的 master分支上
git push origin master
// 查看仓库信息
git remote show origin
// 仓库改名为paul
git remote rename origin paul
git pull == git fetch + git merge
2.4 分支新建,切换与合并
创建和合并分支
git branch # 查看分支
git branch name # 创建name分支
git checkout -b name # 快速创建 name分支并切换到该分支
git checkout name # 切换到name分支
git merge name # 合并name分支到当前分支 采用的是 Fast-forward快进模式,合并速度非常快
git branch -d name # 删除 name分支
从master上拉取新分支
// 切换到master分支
git checkout master
// 同步远程仓库内容
git pull origin master
// 拉取新分支dev2.0
git checkout -b dev2.0
// 推送到远程仓库
git push origin dev2.0
// 关联
git branch --set-upstream-to=origin/dev2.0
// 再次拉去验证
git pull origin dev2.0
将新分支的修改合并到主分支 master上
// 切换到master
git checkout master
// 获取最新代码
git pull
// 合并
git merge dev2.0
// 合并完之后还是到本地,相当于多了很多commit,还需要push到远程仓库
git push
解决不同分支的修改产生的冲突的方法
cat test.txt
# 2222222
# 44444444
# 666666
# 7777777
git checkout dev
# 末尾添加一行 9999
git checkout master
# 末尾添加一行 8888
git add test.txt
git commit -m
git merge dev # 就会产生冲突,可以查看文件发现
cat readme.txt
注:Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>dev 是指dev上dev修改的内容。自己手动修改成和 master一致的内容就可以无冲突提交非Fast-Forward 合并 --no-ff
之后 删除分支后 git log
还保留了被删除的分支信息。
分支策略:master主分支应该是非常稳定的,用来发布新版本,而干活一般情况下在新建的dev分支上干活,干完后,比如要发布,或者说dev分支代码稳定后可以合并到主分支master上来。
Bug分支
每一个bug都可以通过一个临时分支来修复,完成后,合并分支,然后将临时的分支删除掉。
可以先把当前的(还不能提交的)工作分支隐藏起来,等如上述解决完 bug,并提交合并到 master之后,再恢复到原来的工作分支状态。
git stash
git status # 结果是干净的,就是没有什么可以提交了
.....
git stash list # 查看 stash列表
git stash apply # 恢复后,stash内容并不删除 需要手动 git stash drop
git stash pop # 恢复的同时删除了。
2.5 重要的命令
git stash
参考Coder张小凯-Git Stash用法总结,后再赘述。
总结一下:
git stash
用于在切换分支的时候,在自己分支的工作目录下已经完成的一部分工作无法立即提交,又必须要切换时,如果不 git stash
,就无法切换而报错,可以使用git stash暂存目前的工作状态,使目前的分支的状态是 "nothing to commit, working tree clean" 然后就可以切换到其他分支。之后,切换回,再使用 git stash apply
恢复之前的状态。
vi newfile4.txt
git checkout test
error: Your local changes to the following files would be overwritten by checkout:
newfile4.txt
Please commit your changes or stash them before you switch branches.
Aborting
git stash save "first save"
git stash list
git stash show
git checkout test
// 之后返回到来恢复
git checkout master
git status
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
git stash apply
git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: newfile4.txt
no changes added to commit (use "git add" and/or "git commit -a")
这里的git stash pop
和 git stash apply
的区别是后者不删除,前者恢复后会删除那个。
更详细的参考 git stash。
-------------2022-8-3
特别要注意:
在不同分支切换后,返回到原来的工作分支准备 stash apply 一定要显 stash list
查看不同分支版本的的stash记录。而不能盲目的 直接 stash apply
因为往往最新的是在别的分支刚刚stash的状态。这样就驴唇安在马嘴上了,刚刚掉过坑。
git merge
参考指南
IDEA解决冲突的几个做法:参考git pull时冲突的几种解决办法
三. 其他使用技巧
3.1 IDEA使用git的分支可视化显示
配置好账号,项目从gitlab或者github上拉取下来之后,IDEA界面右下角会有 分支的图标
点击,弹出以下窗口
如果远程仓库中新增了一个分支,那么先 Git Branches
刷新直到 Remote Branches
出现新增的分支,然后 在远程分支中切换,点击想要切换的分支,然后右键,checkout操作即可。
注意:在切换分支,如果代码如果没有提交或者stash的话,会自动同步。所以在从dev到主分支过程中,应该先提交或者stash。这样切换分支时就不会带过来。
3.2 .gitignore的使用
使用方法
参考 git 忽略 .idea文件
未生效的原因
在.gitignore
文件中加入目录,但是没有生效的原因是: .idea已经被git跟踪,之后再加入.gitignore后是没有作用的
- 清除.idea的git缓存:
git rm -r --cached .idea
- 然后在
.gitignore
中加入新的一行.idea
然后就生效了。
...... 未完待续
标签:git,stash,add,Git,master,笔记,使用,commit,分支 From: https://www.cnblogs.com/it-bt/p/17071209.html