统一说明:
<file>...
## 这种格式代表添加的文件,比如现在有两个文件:first.text,dir/second.txt
## 以 git add 命令说明:
## 添加单个文件:
git add first.txt
## 添加多个文件:
git add first.txt dir/second.txt
## 添加当前目录及子目录下所有变动文件
git add .
初始化一个仓库
- 创建一个本地仓库
## 在当前文件夹初始化一个仓库
git init
- 从远程clone一个仓库
## 克隆一个远程仓库
git clone url
用户信息配置
安装完Git后,就需要配置用户名和邮箱,每一个git commit都需要用到这个配置信息,必须配置
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
提交本地修改代码到本地仓库
- 有新增文件
git add <file>...
##将文件添加到 index/stage
git add .
git commit -m "commit msg"
- 无新增文件
git commit -a -m "commit msg"
修改撤销
1. workspace修改的撤销(也就是文件修改了,git add 之前的撤销)
- 新增文件
rm <file>...
## 删除某个文件,如果是文件夹需要加-rf
强制删除
## 直接删除文件
rm add.txt
- 删除和修改的文件
git checkout -- <file>...
##将文件替换成index的内容;如果文件没有git add过,则不会有变化。
## 千万注意 --不要忘记了
git checkout -- .
2. index/stage 修改的撤销(也就是 git add后的撤销)
git reset HEAD <file>...
##将文件对应的index替换成最近一次提交的状态
- 撤销到git add之前
## 这个是git add . 的反向操作
git reset HEAD .
##或者
git reset HEAD ##不要点符号
执行上面操作后,文件就回到git add 之前了
- 撤销到workspace修改之前
git checkout HEAD -- .
执行上面操作后修改和删除都会撤销,新增还在在stage
git reset --hard HEAD
执行上面操作后,所有修改都会撤销
3. repository 修改的撤销(也就是 git commit后的撤销)
- 撤销到git commit之前
下面命令任选一个
git reset --soft HEAD^
git reset --soft HEAD^1
git reset --soft HEAD~
git reset --soft HEAD~1
git reset --soft commitHash ##最近提交的之前一个commit 通过git log -2
执行上面命令就回退到git commit之前,可以用于重新修改commit msg
- 撤销到git add之前
下面命令任选一个 默认参数 --mixed
git reset HEAD^
git reset HEAD^1
git reset HEAD~
git reset HEAD~1
git reset commitHash ##最近提交的之前一个commit 通过git log -2
执行上面命令就回退到git add之前,也就是workspace修改之后
- 撤销到workspace修改之前
下面命令任选一个
git reset --hard HEAD^
git reset --hard HEAD^1
git reset --hard HEAD~
git reset --hard HEAD~1
git reset --hard commitHash ##最近提交的之前一个commit 通过git log -2
执行上面操作后,所有修改都会撤销
拉取服务器仓库内容和推送本地仓库内容到服务器仓库
-查看地仓库关联的远程配置信息
本地仓库一般都是通过 git clone url 拉取的,所以自动配置了远程
查看本地仓库的远程配置
$ git remote -v
origin C:/Users/my/Desktop/git_cmd_study/client/../server/ (fetch)
origin C:/Users/my/Desktop/git_cmd_study/client/../server/ (push)
##我是用本地的仓库作为远程来模拟的,所以url是本地的
查看某个远程仓库
$ git remote show origin
* remote origin
Fetch URL: C:/Users/my/Desktop/git_cmd_study/client/../server/
Push URL: C:/Users/my/Desktop/git_cmd_study/client/../server/
HEAD branch: develop
Remote branches:
develop tracked
master tracked
Local branch configured for 'git pull':
develop merges with remote develop
Local ref configured for 'git push':
develop pushes to develop (up to date)
远程仓库是ok的那就开始拉取远程仓库内容
- git fetch + git merge 拉取远程仓库内容
$ git fetch
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From C:/Users/my/Desktop/git_cmd_study/client/../server
c91a69d..ec7df6c develop -> origin/develop
git fetch会将服务器仓库内容拉取下来,不改变当前的工作目录和HEAD,保存服务器的头在FETCH_HEAD,还需要通过git merge合并到当前的HEAD
$ git merge FETCH_HEAD
Updating c91a69d..ec7df6c
Fast-forward
add.txt | 1 +
1 file changed, 1 insertion(+)
如果合并有冲突就解决冲突后,再提交和推送(git push)
- git pull 拉取远程仓库内容
git pull 就是上面两个步骤的合并,下面显示一个有冲突的示例:
~/Desktop/git_cmd_study/client (develop)
$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From C:/Users/KenMa/Desktop/git_cmd_study/client/../server
ec7df6c..d1e08ec develop -> origin/develop
Auto-merging add.txt
CONFLICT (content): Merge conflict in add.txt
Automatic merge failed; fix conflicts and then commit the result.
~/Desktop/git_cmd_study/client (develop|MERGING)
之前的develop现在变成了develop|MERGING,也生成了一个MERGE_HEAD头;后面就是解决冲突和合并请求了
- git push 推送本地仓库到服务器(git push之前可以先git pull一下)
$ git push
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 610 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/develop
remote: error: By default, updating the current branch in a non-bare repository
remote: is denied, because it will make the index and work tree inconsistent
remote: with what you pushed, and will require 'git reset --hard' to match
remote: the work tree to HEAD.
remote:
remote: You can set the 'receive.denyCurrentBranch' configuration variable
remote: to 'ignore' or 'warn' in the remote repository to allow pushing into
remote: its current branch; however, this is not recommended unless you
remote: arranged to update its work tree to match what you pushed in some
remote: other way.
remote:
remote: To squelch this message and still keep the default behaviour, set
remote: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To C:/Users/my/Desktop/git_cmd_study/client/../server/
! [remote rejected] develop -> develop (branch is currently checked out)
error: failed to push some refs to 'C:/Users/my/Desktop/git_cmd_study/client/../server/'
从报错信息可以知道,由于远程仓库是一个non-bare仓库,有workspace,默认拒绝远程推送,解决方法:
- git checkout master(服务器端) 切换到master分支再git push (客户端)
- git config --local --add receive.denyCurrentBranch ignore (服务器端)设置忽略
- 创建服务器仓库时使用 git init --bare 这样服务器仓库就没有workspace(这种仓库操作起来很不方便,不实用,最起码是我测试的时候)
总结:本文主要是罗列了一些常用的git 操作指令,满足一般的需求。操作如:
- 创建git仓库
- 提交修改到本地仓库
- 撤销修改
- 拉取服务器仓库内容
- 推送本地修改到服务器