Git使用笔记

重新复习整理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 移除文件

将文件移除追踪,从已跟踪文件清单中移除(确切地说,是从暂存区域移除),有四种方式:

  1. git rm file:直接移除出跟踪清单,并且从工作目录中删除;
  2. 手动删除文件,再 git rm
  3. 要删除之前修改过或已经放到暂存区的文件,git rm -f;
  4. 想把文件从 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来查看所有重要操作记录。
image.png
可以看到在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 需要使用这个:git push -u 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 popgit stash apply的区别是后者不删除,前者恢复后会删除那个。
更详细的参考 git stash

// 2024-4-3 意外情况
我在错误分支上上 pop了stash的代码,的解决办法是:可以用以下命令撤销刚刚的pop操作

git reset --hard

-------------2022-8-3
特别要注意:
在不同分支切换后,返回到原来的工作分支准备 stash apply 一定要显 stash list查看不同分支版本的的stash记录。而不能盲目的 直接 stash apply因为往往最新的是在别的分支刚刚stash的状态。这样就驴唇安在马嘴上了,刚刚掉过坑。

git merge

参考指南
IDEA解决冲突的几个做法:参考git pull时冲突的几种解决办法

三. 其他使用技巧

3.1 IDEA使用git的分支可视化显示

配置好账号,项目从gitlab或者github上拉取下来之后,IDEA界面右下角会有 分支的图标
image.png
点击,弹出以下窗口
image.png
如果远程仓库中新增了一个分支,那么先 Git Branches刷新直到 Remote Branches出现新增的分支,然后 在远程分支中切换,点击想要切换的分支,然后右键,checkout操作即可。
注意:在切换分支,如果代码如果没有提交或者stash的话,会自动同步。所以在从dev到主分支过程中,应该先提交或者stash。这样切换分支时就不会带过来。

3.2 .gitignore的使用

使用方法
参考 git 忽略 .idea文件

未生效的原因
.gitignore文件中加入目录,但是没有生效的原因是: .idea已经被git跟踪,之后再加入.gitignore后是没有作用的

  1. 清除.idea的git缓存:git rm -r --cached .idea
  2. 然后在 .gitignore 中加入新的一行 .idea
    然后就生效了。

...... 未完待续

posted @ 2023-01-28 21:15  又一个蛇佬腔  阅读(85)  评论(0编辑  收藏  举报