新建仓库文件推送

Git 全局设置
1
2
git config --global user.name "llcn" 
git config --global user.email "llcn@163.com"
创建一个新仓库
1
2
3
4
5
6
7
git clone http://172.17.12.206:8080/jukaifeng/test.git
cd test
git switch -c main
touch README.md
git add README.md
git commit -m "add README"
git push -u origin main
推送现有文件夹
1
2
3
4
5
6
cd existing_folder
git init --initial-branch=main
git remote add origin http://172.17.12.206:8080/jukaifeng/test.git
git add .
git commit -m "Initial commit"
git push -u origin main
推送现有的 Git 仓库
1
2
3
4
5
cd existing_repo 
git remote rename origin old-origin
git remote add origin http://xxx/projects.git
git push -u origin --all
git push -u origin --tags`

git 忽略文件设置

创建
  1. 文件夹内右键git bash,输 touch .gitignore,注意中间有空格
  2. 编辑器打开生成的 .gitignore 文件,加入
1
2
.gitignore
node_modules
  1. 保存
  2. 以后再push到仓库的就会过滤这俩了,想加啥自己加
修改

后期再添加.gitignore文件或者添加某文件夹后,当我们想push文件的时候,我们声明的忽略文件还是会出现在push的目录中

  1. 原因
    某些文件已经被纳入版本管理中,就算是在.gitignore中已经声明也不会起作用

  2. 解决方案
    我们应该先把本地的缓存删除,然后再进行push,操作步骤如下:

1
2
3
git rm -r --cached . // 删除本地缓存
git add . // 添加要提交的文件
git commit -m 'update .gitignore' // 更新本地的缓存

分支-branch

1
2
3
4
5
git checkout <name> // 切换分支

git fetch // 把远程提交拉取到本地仓库,而不是本地工作目录,它不会自行将这些新数据合并到当前工作目录中,我们需要继续执行git merge才会把这些变动合并到当前工作目录。

git pull // git pull和git fetch刚好相反,它直接获取远程的最新提交,直接拉取并合并到本地工作目录,而且在合并过程中不会经过我们的审查,如果不仔细检查,这样很容易遇到冲突。
1. 查看分支
1
2
3
git branch 本地分支
git branch -a 全部分支
git branch -r 远程分支
2. 创建分支
1
2
git checkout -b <branchName>  // 基于当前分支创建本地分支
git checkout -b <branchName> <RemoteBranchName> // 基于远程分支创建
3. 删除分支
1
2
git branch -D <branchName>  // 本地
git push <origin> --delete <RemoteBranchName> // 远程
4. 合并分支
  • commit分支内容
  • 切换回主分支或需要合并的分支
  • 合并
1
git merge <branchname>
  • push到服务器
  • 查看冲突状态
1
git status

5. 删除已经被线上删除的分支对应在本地的映射

假设这样一种情况:

  1. 我创建了本地分支b1并push到远程分支 origin/b1;
  2. 其他人在本地使用fetch或pull创建了本地的b1分支;
  3. 我删除了 origin/b1 远程分支;
  4. 其他人再次执行fetch或者pull并不会删除这个他们本地的 b1 分支,运行 git branch -a 也不能看出这个branch被删除了,如何处理?

使用下面的代码查看b1的状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ git remote show origin

-------------------------------------------------------------------
* remote origin
Fetch URL: git@github.com:xxx/xxx.git
Push URL: git@github.com:xxx/xxx.git
HEAD branch: master
Remote branches:
master tracked
refs/remotes/origin/b1 stale (use 'git remote prune' to remove)
Local branch configured for 'git pull':
master merges with remote master

Local ref configured for 'git push':
master pushes to master (up to date)
----------------------------------------------------------------------

这时候能够看到b1是stale的

1
git remote prune origin // 可以将其从本地版本库中去除

更简单的方法是使用这个命令,它在fetch之后删除掉没有与远程分支对应的本地分支:

1
git fetch -p
6. 重命名远程分支

在git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支。
例如下面的例子中,我需要把 devel 分支重命名为 develop 分支:

1
2
3
4
git branch -av //?
git push --delete origin devel //删除远程分支
git branch -m devel develop // 重命名分支名
git push origin develop // 推送

然而,在 github 上操作的时候,我在删除远程分支时碰到这个错误:

1
2
3
4
5
6
7
8
$ git push --delete origin devel

--------------------------------------------------------------------------------
remote: error: refusing to delete the current branch: refs/heads/devel
To git@github.com:zrong/quick-cocos2d-x.git
! [remote rejected] devel (deletion of the current branch prohibited)
error: failed to push some refs to 'git@github.com:zrong/quick-cocos2d-x.git'
--------------------------------------------------------------------------------

这是由于在 github 中,devel 是项目的默认分支。要解决此问题,这样操作:

1. 进入 github 中该项目的 Settings 页面;
2. 设置 Default Branch 为其他的分支(例如 master);
3. 重新执行删除远程分支命令。

标签-tag

标签的很多命令和分支操作几乎一样

1
git tag test_tag c809ddbf83939a89659e51dc2a5fe183af384233   // //在某个commit 上打tag
1. 删除本地分支或标签
1
git tag -d <tagname>
2. 删除远程分支或标签
1
2
git push origin --delete tag <RemoteTagName>
git push origin :refs/tags/<RemoteTagName>
3. 把本地tag推送到远程
1
2
git push --tags
git push origin test_tag    //!!!本地tag推送到线上
4. 获取远程tag
1
git fetch origin tag <tagname>

存储-stash

1. 存储
1
2
git add .
git stash(git stash save "test-cmd-stash") // 暂存改变
2. 恢复
1
2
git stash pop  //将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下。
git stash apply //将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝
3. 查看
1
git stash list
4. 移除
1
2
git stash drop [name]  删除stash或者加名字删除对应的
git stash clear // 删除所有
5. 查看指定stash的diff

可以使用git stash show命令,后面可以跟着stash名字。

代码回退

对于代码回退,我们一般使用git reset或者git revertreset,revert都有撤销、回退的意思,但却各有千秋,区别还是很大的,所以该使用哪种命令一定要结合实际情况来决定。

git reset

1、git reset –mixed 版本号 :默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,保留修改的源码,回退了commit和index信息,本地工作目录内容以及暂存区内容会继续保留

2、git reset –soft 版本号:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可

本地工作目录内容以及暂存区内容会在回退版本add基础上保留,和–mixed区别是执行后,相当于执行了add操作。

3、git reset –hard 版本号:彻底回退到某个版本,本地的源码也会变为某个版本的内容,暂存区以及本地工作目录内容全部丢失。

git revert

准确来说,revert是撤销/撤回/反提交的意思,我们不能按reset的思路理解

revert执行后会产生新的commit记录,是通过一次新的commit来恢复到之前旧的commit,但revert会保留恢复的该次提交后面的其它提交内容,假如后面的提交与要恢复的提交更改了同一地方,此时用revert就会产生冲突!

例如:

我们依次提交了t1,t2和t3;

我们执行git revert t1,这么做其实结果是要撤销t1的提交,注意,仅仅是撤销t1的提交,把t1的修改恢复到t1之前也就是初始的状态,而不会影响t2,t3的提交。但如果t2,t3中修改了t1修改的同一地方,那么就会产生冲突,因为revert意图撤销t1的修改,但发现t2和t3把t1的修改再次修改了,此时,revert意图变得不清晰,因为它无法确定到底是应用你最新的修改,还是恢复到初始状态,这将由你来决定!

git reset和revert区别的总结

  • reset是彻底回退到指定的commit版本,该commit后的所有commit都将被清除,包括提交历史记录;
  • revert仅仅是撤销指定commit的修改,并不影响后续的commit,但所撤销的commit被后续的commit修改了同一地方则会产生冲突;
  • reset执行后不会产生记录,revert执行后会产生记录;
  • reset执行后无法再次恢复,revert执行后因为不会清除记录,并且会产生新纪录,所以文件不会丢失,你可以多次执行revert恢复到某次改变之前的状态;
  • reset执行后HEAD会后移,而revert的HEAD则一直是向前的;

回退操作扩展

取消对某文件的修改。还原到最近的版本,废弃本地做的修改。
1
git checkout -- <file>
取消已经add暂存的文件。即,撤销先前”git add”的操作
1
git reset HEAD <file>...
修改最后一次提交。用于修改上一次的提交信息,或漏提交文件等情况。
1
git commit --amend
回退所有内容到上一个版本
1
git reset HEAD^
回退a.py这个文件的版本到上一个版本
1
git reset HEAD^ a.py  
向前回退到第3个版本
1
git reset –soft HEAD~3  
将本地的状态回退到和远程的一样
1
git reset –hard origin/master
找回回退记录

查询本地日志

1
git reflog

所以,我们要找回我们第二commit,只需要做如下操作:

1
git reset --hard 98abc5a
回退到某个版本
1
git reset 057d  
回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit.(代码回滚到上个版本,并提交git)
1
git revert HEAD

如果无法理解,参考此文章示例https://www.php.cn/faq/485052.html

git命令整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
git fetch origin master:myfeature(从当前的master分支上新切一个自己的分支,分支名叫myfeature)
git checkout myfeature(切换到myfeature分支上,开始开发)
………修改1
………修改2
git add . (把当前目录下所有的修改都添加到暂存区,只有add了的改动才能commit)
git commit -m “我的提交"
git log(记住你的提交commitid)
git checkout develop(切换到develop测试分支上)
git fetch(git pull也可以,同步远程develop代码到本地)
git cherry-pick commitid(第5步记住的commitid)
git push origin HEAD:refs/for/develop


强制拉取服务器
git reset --hard HEAD
git clean -f -d
git pull

git branch 查看本地所有分支
git status 查看当前状态
git commit 提交
git branch -a 查看所有的分支
git branch -r 查看远程所有分支
git commit -am "init" 提交并且加注释
git remote add origin git@192.168.1.119:ndshowgit push origin master 将文件给推到服务器上
git remote show origin 显示远程库origin里的资源
git push origin master:developgit push origin master:hb-dev 将本地库与服务器上的库进行关联
git checkout --track origin/dev 切换到远程dev分支
git branch -D master develop 删除本地库develop
git checkout -b dev 建立一个新的本地分支dev
git merge origin/dev 将分支dev与当前分支进行合并
git checkout dev 切换到本地dev分支
git remote show 查看远程库
git add .
git rm 文件名(包括路径) 从git中删除指定文件
git clone git://github.com/schacon/grit.git 从服务器上将代码给拉下来
git config --list 看所有用户
git ls-files 看已经被提交的
git rm [file name] 删除一个文件
git commit -a 提交当前repos的所有的改变
git add [file name] 添加一个文件到
git indexgit commit -v 当你用-v参数的时候可以看commit的差
git commit -m "This is the message describing the commit" 添加commit信息
git commit -a -a是代表add,把所有的change加到git index里然后再commitgit commit -a -v 一般提交命令
git log 看你commit的日志
git diff 查看尚未暂存的更新
git rm a.a 移除文件(从暂存区和工作区中删除)
git rm --cached a.a 移除文件(只从暂存区中删除)
git commit -m "remove" 移除文件(从Git中删除)
git rm -f a.a 强行移除修改后文件(从暂存区和工作区中删除)
git diff --cached 或 $ git diff --staged 查看尚未提交的更新
git stash push 将文件给push到一个临时空间中
git stash pop 将文件从临时空间pop下来