# Git基本使用

ssh-keygen -t rsa -C "邮箱地址"

其中生成的 id_rsa.pub 的内容,就是公钥,放到需要授权的服务器上。

全局配置 Git 的用户名和邮箱

git config --global user.name "xxx"
git config --global user.email "xxx@xx.com"

# Git 的工作区域和流程

Git 的4个工作区:

  • Workspace:工作区,就是平时进行开发改动的地方,是当前看到最新的内容,在开发的过程也就是对工作区的操作

  • Index:暂存区,当执行 git add 的命令后,工作区的文件就会被移入暂存区,暂存区标记了当前工作区中那些内容是被 Git 管理的,当完成某个需求或者功能后需要提交代码,第一步就是通过 git add 先提交到暂存区。

  • Repository:本地仓库,位于自己的电脑上,通过 git commit 提交暂存区的内容,会进入本地仓库。

  • Remote:远程仓库,用来托管代码的服务器,远程仓库的内容能够被分布在多个地点的处于协作关系的本地仓库修改,本地仓库修改完代码后通过 git push 命令同步代码到远程仓库。

一般来说,Git 的工作流程分为以下几步

1.在工作区开发,添加,修改文件。 2.将修改后的文件放入暂存区。 3.将暂存区域的文件提交到本地仓库。 4.将本地仓库的修改推送到远程仓库。

# Git 基本操作

# git add

# git add
添加文件到暂存区
# 添加某个文件到暂存区,后面可以跟多个文件,以空格区分
git add xxx
# 添加当前更改的所有文件到暂存区。
git add .

# git commit

# 提交暂存的更改,会新开编辑器进行编辑
git commit 
# 提交暂存的更改,并记录下备注
git commit -m "you message"
# 等同于 git add . && git commit -m
git commit -am
# 对最近一次的提交的信息进行修改,此操作会修改commit的hash值
git commit --amend

# git pull

# 从远程仓库拉取代码并合并到本地,可简写为 git pull 等同于 git fetch && git merge 
git pull <远程主机名> <远程分支名>:<本地分支名>
# 使用rebase的模式进行合并
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>

# git fetch

与 git pull 不同的是 git fetch 操作仅仅只会拉取远程的更改,不会自动进行 merge 操作。对你当前的代码没有影响

# 获取远程仓库特定分支的更新
git fetch <远程主机名> <分支名>
# 获取远程仓库所有分支的更新
git fetch --all

# git branch

# 新建本地分支,但不切换
git branch <branch-name> 
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看本地和远程分支
git branch -a
# 删除本地分支
git branch -D <branch-nane>
# 重新命名分支
git branch -m <old-branch-name> <new-branch-name>

# git log

# 查看git提交记录  
git log

# git revert

想象这么一个场景,你的项目最近有2个版本要上线,这两个版本还伴随着之前遗留的 bug 的修复,一开始的时候,你将 bug 修复在了第一个版本的 release 分支上,突然在发版前一天,测试那边反馈,需要把第一个版本修复 bug 的内容改在第二个版本上,这个时候,第一个版本的集成分支的提交应该包括了第一个版本的功能内容,遗留 bug 修复的提交和其他同事提交的内容,想要通过 reset 的方式粗暴摘除之前的关于 bug 修复的 commit 肯定是不行的,同时,这种做法比较危险,此时,我们既不想破坏之前的提交记录,又想撤回我们遗留 bug 的 commit 记录应该怎么做呢?git revert 就派上了用场。

git revert 撤销某次操作,此操作不会修改原本的提交记录,而是会新增一条提交记录来抵消某次操作。 语法: git revert 针对普通 commit

git revert -m 针对 merge 的 commit

# git stash

会有这么一个场景,现在你正在用你的 feature 分支上开发新功能。这时,生产环境上出现了一个 bug 需要紧急修复,但是你这部分代码还没开发完,不想提交,怎么办?这个时候可以用 git stash 命令先把工作区已经修改的文件暂存起来,然后切换到 hotfix 分支上进行 bug 的修复,修复完成后,切换回 feature 分支,从堆栈中恢复刚刚保存的内容。 基本命令如下

git stash //把本地的改动暂存起来
git stash save "message" 执行存储时,添加备注,方便查找。
git stash pop // 应用最近一次暂存的修改,并删除暂存的记录
git stash apply  // 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即 stash@{0},如果要使用其他个,git stash apply stash@{$num}git stash list // 查看 stash 有哪些存储
git stash clear // 删除所有缓存的 stash

# 查看当前git项目的配置信息

git config --list

# 撤销commit

执行完commit后,想撤回commit,怎么办? git reset --soft HEAD^

这样就成功的撤销了你的commit

注意,仅仅是撤回commit操作,您写的代码仍然保留。 HEAD^的意思是上一个版本,也可以写成HEAD~1

如果你进行了2次commit,想都撤回,可以使用HEAD~2

至于这几个参数: --mixed 意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作 这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。

--soft
不删除工作空间改动代码,撤销commit,不撤销git add .

--hard 删除工作空间改动代码,撤销commit,撤销git add .

注意完成这个操作后,就恢复到了上一次的commit状态。

顺便说一下,如果commit注释写错了,只是想改一下注释,只需要: git commit --amend

此时会进入默认vim编辑器,修改注释完毕后保存就好了。

# git add 添加错文件 撤销

git add 如果添加了错误的文件的话

撤销操作

git status 先看一下add 中的文件 
git reset HEAD 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 
git reset HEAD XXX/XXX/XXX.java 就是对某个文件进行撤销了

# Git操作指南

# 下载GitHub分支上的文件

  • 默认的我们会下载master分支上的文件,但是由于有可能还会存在其他的分支,甚至其他分支上的文件与主分支上的文件大相径庭,所以我们可以这样操作clone
git clone -b branch_name URL.git

# 切换分支,并提交文件

创建新分支

git branch -c branch_name

切换到新分支

git checkout branch_name

列出所有分支

git branch -a

合并分支

  1. 切换到master(主分支)
git checkout master
  1. 合并新分支(子分支)
git merge --no-ff branch_name
  1. 提交注释
git commit -am "merage affect REAMD.md"
  1. 上传更新
git push

# git clone 的参数depth=1有什么用?

  • depth用于指定克隆深度,为1即表示只克隆最近一次commit. 这种方法克隆的项目只包含最近的一次commit的一个分支,体积很小,即可解决文章开头提到的项目过大导致Timeout的问题,但会产生另外一个问题,他只会把默认分支clone下来,其他远程分支并不在本地,所以这种情况下,需要用如下方法拉取其他分支:
$ git clone --depth 1 https://github.com/username/xxxxxxx.git
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

git remote add origin git@github.com:UserName/yourProjectName.git 把本地仓库和远程仓库关联起来,

git push origin master -- 把本地的 commit(提交) push 到远程服务器上, origin 也就是之前 git remote add origin 那个命令里面的 origin,origin 替代了服务器仓库地址:git@github.com:zhoulujun/yourProjectName.git

git status 查看状态

git branch 查看本地所有分支

git branch -r查看远程所有分支

git branch -a查看本地和远程所有分支

git tag 列出所有tag

git show tagName 查看tag信息

git log --stat 显示commit历史,以及每次commit发生变更的文件

分支操作 git checkout branchName 切换到指定分支,并更新工作区

git merge branchName 合并指定分支到当前分支

git branch newBranchName 新建一个分支,但依然停留在当前分支

git branch --track branch remote-branch 新建一个分支,与指定的远程分支建立追踪关系

git branch -D branchName //删除目标分支

git checkout -b branchName 新建并切换至新分支

git branch -d -r branchName 删除远程分支,其中

git branch -m oldbranchname newbranchname 重命名分支 使用-M则表示强制重命名

重命名远程分支

git branch -m old_name new_name 重命名分支

git checkout -b new_branch_name from_branch_name 本地建立 branch 並立即 checkout 切換過去

git push origin –delete old_name

也可以如此操作

git branch -m old_branch new_branch # Rename branch locally

git push origin :old_branch # Delete the old branch

git push --set-upstream origin new_branch 或者git push -u origin new_branch # Push the new branch, set local branch to track the new remote

git强制覆盖本地代码 与git远程仓库保持一致

git fetch --all

git reset --hard origin/master

git pull

git强制覆盖本地命令(单条执行):

git fetch --all && git reset --hard origin/master && git pull

git修改远程仓库地址 方法有三种:

1.修改命令

git remote origin set-url [url]

2.先删后加

git remote rm origin

git remote add origin [url]

3.直接修改config文件

.git文件夹,找到config,编辑,把就的项目地址替换成新的。

git 配置 git config --list 查看配置列表

git config --global user.name "xxx" -- 配置用户名,上传本地 repository 到服务器上的时候,在 Github 上会显示这里配置的上传者信息

git config --global user.email "xxx" -- 配置邮箱 配置 sshkey : 上传代码时使用这个 sshkey 来确认是否有上传权限 1. 创建本地 ssh : ssh-keygen -t rsa -C "Github 的注册邮箱" 2. 在 Github 中添加这个 sshkey : 复制 C:\Documents and Settings\Administrator.ssh\id_rsa.pub 文件中的内容; 登录 Github --> Account Setting --> SSH-KEY --> Add SSH-KEY --> 粘贴id_rsa.pub中的内容; 3. 验证: ssh -T git@github.com 出现 Hi xxx! You've successfully authenticated, but GitHub does not provide shell access. 说明配置成功,可以连接上 Github

使用 .gitignore 文件忽略指定的内容:

1. 在本地仓库根目录创建 .gitignore 文件。Win7 下不能直接创建,可以创建 ".gitignore." 文件,后面的标点自动被忽略;
2. 过滤文件和文件夹: [Tt]emp/ 过滤 Temp\temp 文件夹; *.suo 过滤 .suo 文件;
3. 不过滤文件和文件夹: !*.c


参考: <https://www.zhoulujun.cn/html/tools/VCS/git/402.html>

关于评论

评论前请填好“昵称”、“邮箱”这两栏内容,否则不会收到回复,谢谢!