git 合作开发教程

 

 

1、首先,我们这里选用GitHub作为代码存储仓库,git bash是我们常用的git操作窗口(cmd也可以,建议用git bash)。

GitHub:https://github.com/

Git工具:https://git-scm.com/download/win

注册GitHub账号并安装好git就可以在项目目录下右键打开git bash了。

2、设置git用户名和邮箱:

git config --global user.name "username"

git config --global user.email "email"

查看用户名和邮箱:

git config user.name

git config user.email

 

3. 接下来就要连接仓库了,这时候就需要SSH Key添加到项目owner(项目拥有者)的GitHub上。

创建SSH Key。在项目主目录或者系统的目录( C:\Users\ion\.ssh )下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

ssh-keygen -t rsa -C "[youremail@example].com"

这里的youremail@example.com是GitHub的注册邮箱。如果一切顺利的话,可以在项目主目录或者( C:\Users\ion\.ssh )里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人,所以大胆地把id_rsa.pub告诉我吧。

3、owner根据你的GitHub账号(注册邮箱)和id_rsa.pub就能将你拉入项目组里面了,然后团队开发的环境就建立起来了。

(如何加入SSH Key和创建项目组多翻翻GitHub就可以知道了,或者看下我写的另一篇博客。这里是给项目成员而非项目拥有者专门写的教程)

4、接下来描述一下团队开发方式。

     第一步:若本地没有从GitHub上下载过代码,那么请在一个文件夹下打开git bash ,直接使用下面命令拿取代码到当前目录:

git clone git@github.com:Cheerfulion/scut-v2.0.git

git clone 命令后面的 git@github.com:Cheerfulion/scut-v2.0.git 这么一串是项目的git地址,可以在任何一个git的托管平台项目上看到,而且不需要建立链接(即不需要添加你的ssh key到他的项目上)就能下载代码。GitHub的git地址显示位置如下:

 

查看分支:git branch 

前面带*号的是远程分支。默认是查看本地分支,带上参数 -r是查看远程分支,-a是远程和本地的所有分支

 

创建分支:git branch <new branch name> <come from where>

//示例1 从本地某一分支继承代码创建新分支
git branch new-branch-name dev

//示例2 从远程某一分支继承代码创建分支
git branch new-branch-name origin/dev

//示例3 不指定继承分支,默认继承当前所在分支
git branch new-branch-name

切换分支:git checkout <branch-name>

创建并切换分支:git checkout -b <new_branch_name>

删除分支:git branch -d <branch_name>

若你的代码不是从远程克隆(git clone)下来的,提交代码到远程时就会因为没有关联到远程库而失败,关联远程库使用下面命令(后面的依旧是git地址,和git clone倒是很相似):

git remote add origin git@[server-name]:[path]/[repo-name].git

之后就可以使用 git push -u origin <origin_branch_name> 使进行提交了。当然提交前要add并且commit才能提交自己的修改哦。

 

备注:今天这样子执行遇到一个问题,如下:

解决方法来自:https://jingyan.baidu.com/article/f3e34a12a25bc8f5ea65354a.html

 

今天(2019-06-06 23:38)又遇到了上面这个问题,无法使用git pull --rebase origin master 解决。

 

解决方法:

参考:https://blog.csdn.net/u012145252/article/details/80628451

 

 

下面是正常情况下多人合作开发的一般步骤:

1、若本机没有下载项目文件,则 git clone 下载。

2、在项目上创建新的分支,在新的分支上进行代码调整,调整完成后到第三步。

3、先add并且commit提交本次修改后使用git pull拉取远程代码到相应项目位置。或者使用git fetch和git merge,提交修改到本地(add-->commit)需要再git merge前面执行。其实这里的git pull就是git fetch和git merge的集合。

4、最后使用git push提交当前分支到远程仓库就完成。注意:一般在正式项目上是不允许提交的当前分支是dev或者master分支的,这两个分支提交到远程也是对应远程的dev和master分支,而这两个分支通常都是要保证绝对无误的,也就是要测试部门测试通过才能合并。

 

使用情况小结:

git在本地修改文件后放弃修改或者删除文件如何从远程拉去该文件?

单个文件: git checkout  <filename>
当前目录: git checkout .

注意最好选好修改文件目录位置下执行,否则filename还要包括路径。

 删除误增加的文件:

git clean -f  
#删除当前目录下所有没有track过的文件. 他不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过

https://blog.csdn.net/leon1741/article/details/54314565

删除本次未add的所有修改(增删改)

git checkout . && git clean -f

git bash 使用小技巧:

clear 清屏

 

 

1.  已经push到远程服务器的代码,要回退需要git reset本地仓库,之后再通过git push --force强制推到非保护分支.

步骤:

① git log 查看要回退到的版本号

②git reset [--hard | --soft] <版本号>

   --hard 撤销工作区的修改,工作区内容和版本保持一致.

  --soft 保留工作区修改,以便重新提交

③git push --force 因gitlab的提交历史在本地的前面,需要加上--force强制推送,需要注意的是对于保护分支依旧会报错,这时需要管理员暂时取消分支保护.

 

2. git远程分支覆盖本地分支(超级好用)

有时候同一个分支,远程的和本地的都被修改的面目全非了,如果想要把本地的替换成远程的,用下面的命令

git fetch --all
git reset --hard origin/master (这里master要修改为对应的分支名)
git pull (解决可能的冲突)

 

 

3. 忘记切换分支,误将代码提交到了别的远程分支(超级好用)

# 回滚提交 reset

# 首先我想到的是 reset 命令将我最近一次提交放回暂存区, 并取消此次提交.

git reset HEAD~1

# 将更改到缓存区

git add .

# 将被跟踪的内容stash, 新建的文件不用担心, 依旧是未跟踪文件.

git stash 

# 切换到正确分支(或者创建一个分支)

git checkout -t origin/production -b issue-0

# 将stash的内容pop出来

git stash pop

# 提交和推送了

git add .

git commit -m "提交信息"

git push origin issue-0 

# 但原来的分支production依旧是多了一次提交, 这时候需要切回去, 提交一次

git checkout production 

git push origin production -f    # 这里要加上-f强制提交

 

 

4. 代码提交到了线上master分支上时,因为线上分支不能强制推送,要回退版本要在master上revert,从最新的开始revert到你需要回退到的位置。当然即使这样子,当需求较多而测试跟不上时,大量的分支混在master分支上并不好回退,所以最好每次都从正式拿取代码,测试时更新到master.当需要更新指定的内容时只需要更新相应的分支到正式就行了,就不从master更新到正式

 

5.  error: object file .git/objects/xx/xxxxx is empty

  • 备份.git目录
cp -a .git .git-old
  • 根据修复提示删除空对象文件。根据最早的空文件提示也删除那个文件。
git fsck --full
rm .git/objects/19/b45524e14258043923c2bc4d336269f1abc67f
  • 删除后再次查看修复提示,说明Head commit无效。
git fsck --full
// 段错误 (核心已转储)% (3/256)   
git reflog
// fatal: bad object HEAD
  • 找到当前分支Head的前两条数据。
tail -n 2 .git/logs/refs/heads/master
//注意,如果不是master分支,则.git/logs/refs/heads/branchName

// a6f48ebd79ef39b2c43e5810fc96e95cc0867389 ed41eac57be18e8d112ca5bb898dd77c3b120321 
  • 第一条Head是无效的。我们需要确认第二条是我们的上次失败的commit的前一个提交。
git show ed41eac57be18e8d112ca5bb898dd77c3b120321 
//输出信息为日志详细信息。
  • 设置确认的commit为HEAD commit
git update-ref HEAD ed41eac57be18e8d112ca5bb898dd77c3b120321 
  • 再次使用 git status 和 git reflog 看看功能是否正常了。如果还不行。重启下电脑。

参考:https://git-scm.com/book/zh/v1/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-%E7%BB%B4%E6%8A%A4%E5%8F%8A%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D

https://stackoverflow.com/questions/11706215/how-to-fix-git-error-object-file-is-empty

 

 

window下配置.gitignore

1. 在仓库目录下打开GitBash,输入命令 touch .gitignore

2. 常用的.gitignore配置

.mvn
.iml
mvnw
mvnw.cmd
target/
help.md
.cache
.project
.settings
.classpath

*.log
logs/
 
.idea
.idea/

# dependencies
node_modules/

# production
build/
dist/

# misc
.idea/
.happypack
.DS_Store

npm-debug.log*
yarn-debug.log*
yarn-error.log*

application.properties

配置无效几种情况

  • 命令格式错误
  • 在配置语句的前后面添加空格、Tab、注释等,会导致当前行的配置语句失效
  • 配置语句对已经add、commit的文件无效(.gitignore只能忽略原来没有被追踪的文件,如已被纳入了版本管理中,则修改.gitignore是无效的。)
  • 对于提交到了远程仓库的文件,解决方法参考:https://segmentfault.com/q/1010000000430426

第三种情况解决办法:删除本地缓存

. 可以改成不希望关联的文件

git rm -r --cached .
git add .

git commit -m 'update .gitignore'

 

如何快速关联/修改Git远程仓库地址

参考: https://www.cnblogs.com/youcong/p/10809085.html

删除本地仓库当前关联的无效远程地址,再为本地仓库添加新的远程仓库地址

git remote -v //查看git对应的远程仓库地址
git remote rm origin //删除关联对应的远程仓库地址
git remote -v //查看是否删除成功,如果没有任何返回结果,表示OK
//重新关联git远程仓库地址
//这里需要注意,关联https的话部署秘钥是无效的,还是要通过账号密码去拉取代码。
//如果一定要关联https的路径的话,可以百度下缓存账号密码的方式
git remote add origin git@gitlab.xxx.cn:integrated-projects/korea.git 
// 测试是否可以连接到远程仓库,如果没有welcome,需要配置秘钥(参考上面的ssh key生成)
ssh -T git@gitlab.xxx.cn
git branch --set-upstream-to=origin/master master // 设置关联,这里是关联本地master分支和远程master分支

其实不仅仅上述这一种方式,还有如下几种方式:

直接修改本地仓库所关联的远程仓库的地址

git remote  //查看远程仓库名称:origin 
git remote get-url origin //查看远程仓库地址
git remote set-url origin https://github.com/developers-youcong/Metronic_Template.git  ( 如果未设置ssh-key,此处仓库地址为 http://... 开头)

修改 .git 配置文件

cd .git  //进入.git目录
vim config  //修改config配置文件,快速找到remote "origin"下面的url并替换即可实现快速关联和修改

 

 

git常见后悔药


撤销本地全部没有git add过的修改
git checkout -- .

使用库上文件覆盖本地修改(当然是指用本地库覆盖)git checkout file_name

回退掉某一次commit,回退方式是自动生成一个反向的commit,不会影响其他commmitgit revert commitID

将git库状态强制回退到某个节点号,这个节点号之后的commit全部丢失git reset --hard commitID

将远端库强制覆盖到本地,放弃本地全部修改git reset --hard origin 分支名

回退最近一次的commit,且该次commit所作的修改会退到没有被add的状态git reset --mixed HEAD~1

回退最近的一次commit,回退后该次commit所作的修改仍处于add过了的状态,可以通过git status查看状态,git reset --soft HEAD~1

回退最近一次的commit,回退的同时working tree也会被修改,也就是回退的这次的commit所做的修改都会消失git reset --hard HEAD~1


原文链接:https://blog.csdn.net/qq_15437667/article/details/52762196

 

 

删除untracked files

# 删除 untracked files
git clean -f
 
# 连 untracked 的目录也一起删掉
git clean -fd
 
# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd
 
# 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git clean -nf
git clean -nfd

 

去除gitlab对分支的保护

有时候对master分支进行强制push【git push -f】时会报错

这是因为master分支受保护,处理方式是去掉这个保护。解决方法如下:
找到Branches----project setting --Protected Branches–点击master的unprotect即可。

 

 

git的默认编辑器是nano,关于如何使用请看

http://www.vpser.net/manage/nano.html

 

 

解决 git pull/push 每次都要输入用户名密码的问题

原文链接:https://www.jianshu.com/p/5b81c9ce505c

首先明确一点:出现这种问题的原因都是因为使用 http 的方式拉取代码才出现的,如下图所示:

第一种解决方法(windows)

出现上面这种情况 先按提示输入用户名和密码,接着执行 git config --global credential.helper store
这句命令的意义是在本地生成包含 git 账号和密码的文件,具体操作如下图:

检验方式:C:\Users\你的电脑名; 这个文件夹(如下)下面是否能找到.git-credentials文件,如果文件的内容是有关你的gitlab的设置,格式为:http://{用户名}:{密码}@{git 网址}

再次执行 git pull 操作就不需要再输入用户名和密码了

 

第二种解决方法(通用)

切换 git 的拉取方式,将 http 改为 ssh 的方式
1、查看clone 地址:git remote -v

 

2、移除 http 的方式:git remote rm origin

移除完之后再次查看拉取方式会发现为空,此时我们需要添加 ssh 的拉取方式


3、换成 ssh方式: git remote add origin [git 地址]

 

此时通过 git remote -v 查看会发现成功的从 http 拉取方式切换为 ssh 拉取方式了
大功告成!

 

Git删除暂存区或版本库中的文件

https://www.cnblogs.com/cposture/p/git.html

 

 

Q&A:

1. fatal: Out of memory, malloc failed (tried to allocate 2000000000 bytes)

原因:因用了其他博客的解决方案使用了下面命令导致,修改成正常大小即可。

git config --global http.postBuffer 20000000

解决:git config --global http.postBuffer 125000

 

 

Git 查看两个版本的差异和修改了那些文件

查看两个提交版本id的修改记录差异
$ git diff [commit-id1] [commit-id2]

查看两个提交版本id修改了那些文件,可以使用
$ git diff [commit-id1] [commit-id2] --stat

 

 

git clone是输错账号密码导致后面clone报错

fatal: Authentication failed for 'https://gitlab.cyagen.cn/integrated-projects/cyagen-ap.git/

解决方法:删除git的window凭据

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值