Whats the best way to handle refactoring a big file? The Next CEO of Stack OverflowFile structure of object-oriented projects seems clutteredBest way to use source control for a project (1-3 people)What's the best way to undo a Git merge that wipes files out of the repo?Developers blocked by waiting on code to merge from another branch using GitFlowGit branch model critique: always derive from masterGit branching strategy for long-running unreleased codeThe trend of the “develop” branch going awayAuto-merging from master to all branches — good or bad idea?Branching a subdirectory while keeping commits from other directoriesIs it good practice to switch back to an old branch to develop a new feature or to create a new branch?What are the “gotchas” of refactoring code that is binary serialized?

How to disable updates in WordPress theme

How do I go from 300 unfinished/half written blog posts, to published posts?

Why do remote companies require working in the US?

Increase performance creating Mandelbrot set in python

How can I quit an app using Terminal?

Under what conditions does the function C = f(A,B) satisfy H(C|A) = H(B)?

When did Lisp start using symbols for arithmetic?

What makes a siege story/plot interesting?

How easy is it to start Magic from scratch?

How to draw fully connected graph link picture bellow in latex?

Is the concept of a "numerable" fiber bundle really useful or an empty generalization?

Does the Brexit deal have to be agreed by both Houses?

% symbol leads to superlong (forever?) compilations

Describing a person. What needs to be mentioned?

What can we do to stop prior company from asking us questions?

Inappropriate reference requests from Journal reviewers

'Given that' in a matrix

How to write papers efficiently when English isn't my first language?

Apart from "berlinern", do any other German dialects have a corresponding verb?

Why were Madagascar and New Zealand discovered so late?

Is HostGator storing my password in plaintext?

Why does standard notation not preserve intervals (visually)

Return the Closest Prime Number

What is the meaning of "rider"?



Whats the best way to handle refactoring a big file?



The Next CEO of Stack OverflowFile structure of object-oriented projects seems clutteredBest way to use source control for a project (1-3 people)What's the best way to undo a Git merge that wipes files out of the repo?Developers blocked by waiting on code to merge from another branch using GitFlowGit branch model critique: always derive from masterGit branching strategy for long-running unreleased codeThe trend of the “develop” branch going awayAuto-merging from master to all branches — good or bad idea?Branching a subdirectory while keeping commits from other directoriesIs it good practice to switch back to an old branch to develop a new feature or to create a new branch?What are the “gotchas” of refactoring code that is binary serialized?










5















Im currently working on a bigger project which unfortunately has some files where software quality guidelines where not always followed. This includes big files (read 2000-4000 lines) which clearly contain multiple distinct functionalities.



Now I want to refactor these big files into multiple small ones. The issue is, since they are so big, multiple people (me included) on different branches are working on these files. So I cant really branch from develop and refactor, since merging these refactorings with other peoples changes will become difficult.



We could of course require everyone to merge back to develop, "freeze" the files (ie. dont allow anyone to edit them anymore), refactor, and then "unfreeze". But this is not really good either, since this would require everyone to basically stop their work on these files until refactoring is done.



So is there a way to refactor, dont require anyone else to stop working (for to long) or merge back their feature branches to develop?










share|improve this question







New contributor




Hoff is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




















  • stackoverflow.com/questions/1897585/…

    – Robert Andrzejuk
    2 hours ago






  • 1





    I think this also depends on the programming language used.

    – Robert Andrzejuk
    2 hours ago















5















Im currently working on a bigger project which unfortunately has some files where software quality guidelines where not always followed. This includes big files (read 2000-4000 lines) which clearly contain multiple distinct functionalities.



Now I want to refactor these big files into multiple small ones. The issue is, since they are so big, multiple people (me included) on different branches are working on these files. So I cant really branch from develop and refactor, since merging these refactorings with other peoples changes will become difficult.



We could of course require everyone to merge back to develop, "freeze" the files (ie. dont allow anyone to edit them anymore), refactor, and then "unfreeze". But this is not really good either, since this would require everyone to basically stop their work on these files until refactoring is done.



So is there a way to refactor, dont require anyone else to stop working (for to long) or merge back their feature branches to develop?










share|improve this question







New contributor




Hoff is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




















  • stackoverflow.com/questions/1897585/…

    – Robert Andrzejuk
    2 hours ago






  • 1





    I think this also depends on the programming language used.

    – Robert Andrzejuk
    2 hours ago













5












5








5








Im currently working on a bigger project which unfortunately has some files where software quality guidelines where not always followed. This includes big files (read 2000-4000 lines) which clearly contain multiple distinct functionalities.



Now I want to refactor these big files into multiple small ones. The issue is, since they are so big, multiple people (me included) on different branches are working on these files. So I cant really branch from develop and refactor, since merging these refactorings with other peoples changes will become difficult.



We could of course require everyone to merge back to develop, "freeze" the files (ie. dont allow anyone to edit them anymore), refactor, and then "unfreeze". But this is not really good either, since this would require everyone to basically stop their work on these files until refactoring is done.



So is there a way to refactor, dont require anyone else to stop working (for to long) or merge back their feature branches to develop?










share|improve this question







New contributor




Hoff is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












Im currently working on a bigger project which unfortunately has some files where software quality guidelines where not always followed. This includes big files (read 2000-4000 lines) which clearly contain multiple distinct functionalities.



Now I want to refactor these big files into multiple small ones. The issue is, since they are so big, multiple people (me included) on different branches are working on these files. So I cant really branch from develop and refactor, since merging these refactorings with other peoples changes will become difficult.



We could of course require everyone to merge back to develop, "freeze" the files (ie. dont allow anyone to edit them anymore), refactor, and then "unfreeze". But this is not really good either, since this would require everyone to basically stop their work on these files until refactoring is done.



So is there a way to refactor, dont require anyone else to stop working (for to long) or merge back their feature branches to develop?







git refactoring code-quality






share|improve this question







New contributor




Hoff is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question







New contributor




Hoff is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question






New contributor




Hoff is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 3 hours ago









HoffHoff

312




312




New contributor




Hoff is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Hoff is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Hoff is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












  • stackoverflow.com/questions/1897585/…

    – Robert Andrzejuk
    2 hours ago






  • 1





    I think this also depends on the programming language used.

    – Robert Andrzejuk
    2 hours ago

















  • stackoverflow.com/questions/1897585/…

    – Robert Andrzejuk
    2 hours ago






  • 1





    I think this also depends on the programming language used.

    – Robert Andrzejuk
    2 hours ago
















stackoverflow.com/questions/1897585/…

– Robert Andrzejuk
2 hours ago





stackoverflow.com/questions/1897585/…

– Robert Andrzejuk
2 hours ago




1




1





I think this also depends on the programming language used.

– Robert Andrzejuk
2 hours ago





I think this also depends on the programming language used.

– Robert Andrzejuk
2 hours ago










4 Answers
4






active

oldest

votes


















3














You have correctly understood that this is not so much a technical as a social problem: if you want to avoid excessive merge conflicts, the team needs to collaborate in a way that avoids these conflicts.



This is part of a general problem with Git, in that branching is very easy but merging can still take a lot of effort. Development teams tend to launch a lot of branches and are then surprised that merging them is difficult, possibly because they are trying to emulate the Git Flow without understanding its context.



The general rule to fast and easy merges is to prevent big differences from accumulating, in particular that feature branches should be very short lived (hours or days, not months). A development team that is able to rapidly integrate their changes will see fewer merge conflicts. If some code isn't yet production ready, it might be possible to integrate it but deactivate it through a feature flag. As soon as the code has been integrated into your master branch, it becomes accessible to the kind of refactoring you are trying to do.



That might be too much for your immediate problem. But it may be feasible to ask colleagues to merge their changes that impact this file until the end of the week so that you can perform the refactoring. If they wait longer, they'll have to deal with the merge conflicts themselves. That's not impossible, it's just avoidable work.



You may also want to prevent large swaths of dependent code by making API-compatible changes. For example, if you want to extract some functionality into a separate module:



  1. Extract the functionality into a separate module.

  2. Change the old functions to forward their calls to the new API.

  3. Over time, port dependent code to the new API.

  4. Finally, you can delete the old functions.

This multi-step process can avoid many merge conflicts. In particular, there will only be conflicts if someone else is also changing the functionality you extracted. The cost of this approach is that it's much slower than changing everything at once, and that you temporarily have two duplicate APIs. This isn't so bad until something urgent interrupts this refactoring, the duplication is forgotten or deprioritized, and you end up with a bunch of tech debt.



But in the end, any solution will require you to coordinate with your team.






share|improve this answer























  • So, if I got It right, the advice is smaller developments, frequent commits (push) and daily (to say something) merges. Right? In other words, to change the SDLC cadence

    – Laiv
    2 hours ago












  • @Laiv Unfortunately that is all extremely general advice, but some ideas out of the agile-ish space like Continuous Integration clearly have their merits. Teams that work together (and integrate their work frequently) will have an easier time making large cross-cutting changes than teams that only work alongside each other. This isn't necessarily about the SDLC at large, more about the collaboration within the team. Some approaches make working alongside more feasible (think Open/Closed Principle, microservices) but OP's team isn't there yet.

    – amon
    2 hours ago











  • If it's about collaboration. Would it be possible to get involved the team in the refactor? Seems to me that right now it's only one-dev's job. Multiple files of +4K LOC sounds like too much refactor for a single person to do. Or too much responsibility

    – Laiv
    2 hours ago







  • 1





    I wouldn't go so far as to say a feature branch needs to have a short lifetime -- merely that it should not diverge from its parent branch for long periods of time. Regularly merging changes from the parent branch into the feature branch works in those cases where the feature branch needs to stick around longer. Still, it's a good idea to keep feature branches around no longer than necessary.

    – Dan Lyons
    1 hour ago


















2














You are thinking of splitting the file as an atomic operation, but there are intermediate changes you can make. The file gradually became huge over time, it can gradually become small over time.



Pick a part that hasn't had to change in a long time (git blame can help with this), and split that off first. Get that change merged into everyone's branches, then pick the next easiest part to split. Maybe even splitting one part is too big a step and you should just do some rearranging within the large file first.



If people aren't frequently merging back to develop, you should encourage that, then after they merge, take that opportunity to split off the parts they just changed. Or ask them to do the splitting off as part of the pull request review.



The idea is to slowly move toward your goal. It will feel like progress is slow, but then suddenly you'll realize your code is a lot better. It takes a long time to turn an ocean liner.






share|improve this answer






























    2














    Do the refactoring in smaller steps. Lets say your large file has the name Foo:



    1. Add a new empty file Bar - commit it to "trunk".


    2. Find a small portion of the code in Foo which can be moved over to Bar. Apply the move, update from trunk, build and test the code, and commit to "trunk".


    3. Repeat step 2 until Foo and Bar have equal size (or whatever size you prefer)


    That way, next time your team mates update their branches from trunk, they get your changes in "small portions" and can merge them one-by-one, which is a lot easier than having to merge a full split in one step. Same holds when in step 2 you get a merge conflict because someone else in between updated trunk.



    This won't eliminate merge conflicts, but it restricts each conflict to a small area of code, which is way more manageable.



    And of course - communicate the refactoring in the team. Inform your mates what you are doing, so they know why they have to expect merge conflicts for the particular file.






    share|improve this answer
































      0














      Wait until hometime. Split the file, commit and merge to master.



      Other people will have to pull the changes into their feature branches in the morning like any other change.






      share|improve this answer























      • Still would mean they would have to merge my refactorings with their changes though...

        – Hoff
        2 hours ago











      • somewhat related: suggestion about uncluttering file structure

        – Nick Alexeev
        2 hours ago












      • they are going to have to merge that big file with one another anyway. merging with your split version might actually reduce the total pain

        – Ewan
        2 hours ago











      • Well, they actually have to deal with merges anyways if they all are changing these files.

        – Laiv
        2 hours ago












      Your Answer








      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "131"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: false,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: null,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );






      Hoff is a new contributor. Be nice, and check out our Code of Conduct.









      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsoftwareengineering.stackexchange.com%2fquestions%2f389380%2fwhats-the-best-way-to-handle-refactoring-a-big-file%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      4 Answers
      4






      active

      oldest

      votes








      4 Answers
      4






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      3














      You have correctly understood that this is not so much a technical as a social problem: if you want to avoid excessive merge conflicts, the team needs to collaborate in a way that avoids these conflicts.



      This is part of a general problem with Git, in that branching is very easy but merging can still take a lot of effort. Development teams tend to launch a lot of branches and are then surprised that merging them is difficult, possibly because they are trying to emulate the Git Flow without understanding its context.



      The general rule to fast and easy merges is to prevent big differences from accumulating, in particular that feature branches should be very short lived (hours or days, not months). A development team that is able to rapidly integrate their changes will see fewer merge conflicts. If some code isn't yet production ready, it might be possible to integrate it but deactivate it through a feature flag. As soon as the code has been integrated into your master branch, it becomes accessible to the kind of refactoring you are trying to do.



      That might be too much for your immediate problem. But it may be feasible to ask colleagues to merge their changes that impact this file until the end of the week so that you can perform the refactoring. If they wait longer, they'll have to deal with the merge conflicts themselves. That's not impossible, it's just avoidable work.



      You may also want to prevent large swaths of dependent code by making API-compatible changes. For example, if you want to extract some functionality into a separate module:



      1. Extract the functionality into a separate module.

      2. Change the old functions to forward their calls to the new API.

      3. Over time, port dependent code to the new API.

      4. Finally, you can delete the old functions.

      This multi-step process can avoid many merge conflicts. In particular, there will only be conflicts if someone else is also changing the functionality you extracted. The cost of this approach is that it's much slower than changing everything at once, and that you temporarily have two duplicate APIs. This isn't so bad until something urgent interrupts this refactoring, the duplication is forgotten or deprioritized, and you end up with a bunch of tech debt.



      But in the end, any solution will require you to coordinate with your team.






      share|improve this answer























      • So, if I got It right, the advice is smaller developments, frequent commits (push) and daily (to say something) merges. Right? In other words, to change the SDLC cadence

        – Laiv
        2 hours ago












      • @Laiv Unfortunately that is all extremely general advice, but some ideas out of the agile-ish space like Continuous Integration clearly have their merits. Teams that work together (and integrate their work frequently) will have an easier time making large cross-cutting changes than teams that only work alongside each other. This isn't necessarily about the SDLC at large, more about the collaboration within the team. Some approaches make working alongside more feasible (think Open/Closed Principle, microservices) but OP's team isn't there yet.

        – amon
        2 hours ago











      • If it's about collaboration. Would it be possible to get involved the team in the refactor? Seems to me that right now it's only one-dev's job. Multiple files of +4K LOC sounds like too much refactor for a single person to do. Or too much responsibility

        – Laiv
        2 hours ago







      • 1





        I wouldn't go so far as to say a feature branch needs to have a short lifetime -- merely that it should not diverge from its parent branch for long periods of time. Regularly merging changes from the parent branch into the feature branch works in those cases where the feature branch needs to stick around longer. Still, it's a good idea to keep feature branches around no longer than necessary.

        – Dan Lyons
        1 hour ago















      3














      You have correctly understood that this is not so much a technical as a social problem: if you want to avoid excessive merge conflicts, the team needs to collaborate in a way that avoids these conflicts.



      This is part of a general problem with Git, in that branching is very easy but merging can still take a lot of effort. Development teams tend to launch a lot of branches and are then surprised that merging them is difficult, possibly because they are trying to emulate the Git Flow without understanding its context.



      The general rule to fast and easy merges is to prevent big differences from accumulating, in particular that feature branches should be very short lived (hours or days, not months). A development team that is able to rapidly integrate their changes will see fewer merge conflicts. If some code isn't yet production ready, it might be possible to integrate it but deactivate it through a feature flag. As soon as the code has been integrated into your master branch, it becomes accessible to the kind of refactoring you are trying to do.



      That might be too much for your immediate problem. But it may be feasible to ask colleagues to merge their changes that impact this file until the end of the week so that you can perform the refactoring. If they wait longer, they'll have to deal with the merge conflicts themselves. That's not impossible, it's just avoidable work.



      You may also want to prevent large swaths of dependent code by making API-compatible changes. For example, if you want to extract some functionality into a separate module:



      1. Extract the functionality into a separate module.

      2. Change the old functions to forward their calls to the new API.

      3. Over time, port dependent code to the new API.

      4. Finally, you can delete the old functions.

      This multi-step process can avoid many merge conflicts. In particular, there will only be conflicts if someone else is also changing the functionality you extracted. The cost of this approach is that it's much slower than changing everything at once, and that you temporarily have two duplicate APIs. This isn't so bad until something urgent interrupts this refactoring, the duplication is forgotten or deprioritized, and you end up with a bunch of tech debt.



      But in the end, any solution will require you to coordinate with your team.






      share|improve this answer























      • So, if I got It right, the advice is smaller developments, frequent commits (push) and daily (to say something) merges. Right? In other words, to change the SDLC cadence

        – Laiv
        2 hours ago












      • @Laiv Unfortunately that is all extremely general advice, but some ideas out of the agile-ish space like Continuous Integration clearly have their merits. Teams that work together (and integrate their work frequently) will have an easier time making large cross-cutting changes than teams that only work alongside each other. This isn't necessarily about the SDLC at large, more about the collaboration within the team. Some approaches make working alongside more feasible (think Open/Closed Principle, microservices) but OP's team isn't there yet.

        – amon
        2 hours ago











      • If it's about collaboration. Would it be possible to get involved the team in the refactor? Seems to me that right now it's only one-dev's job. Multiple files of +4K LOC sounds like too much refactor for a single person to do. Or too much responsibility

        – Laiv
        2 hours ago







      • 1





        I wouldn't go so far as to say a feature branch needs to have a short lifetime -- merely that it should not diverge from its parent branch for long periods of time. Regularly merging changes from the parent branch into the feature branch works in those cases where the feature branch needs to stick around longer. Still, it's a good idea to keep feature branches around no longer than necessary.

        – Dan Lyons
        1 hour ago













      3












      3








      3







      You have correctly understood that this is not so much a technical as a social problem: if you want to avoid excessive merge conflicts, the team needs to collaborate in a way that avoids these conflicts.



      This is part of a general problem with Git, in that branching is very easy but merging can still take a lot of effort. Development teams tend to launch a lot of branches and are then surprised that merging them is difficult, possibly because they are trying to emulate the Git Flow without understanding its context.



      The general rule to fast and easy merges is to prevent big differences from accumulating, in particular that feature branches should be very short lived (hours or days, not months). A development team that is able to rapidly integrate their changes will see fewer merge conflicts. If some code isn't yet production ready, it might be possible to integrate it but deactivate it through a feature flag. As soon as the code has been integrated into your master branch, it becomes accessible to the kind of refactoring you are trying to do.



      That might be too much for your immediate problem. But it may be feasible to ask colleagues to merge their changes that impact this file until the end of the week so that you can perform the refactoring. If they wait longer, they'll have to deal with the merge conflicts themselves. That's not impossible, it's just avoidable work.



      You may also want to prevent large swaths of dependent code by making API-compatible changes. For example, if you want to extract some functionality into a separate module:



      1. Extract the functionality into a separate module.

      2. Change the old functions to forward their calls to the new API.

      3. Over time, port dependent code to the new API.

      4. Finally, you can delete the old functions.

      This multi-step process can avoid many merge conflicts. In particular, there will only be conflicts if someone else is also changing the functionality you extracted. The cost of this approach is that it's much slower than changing everything at once, and that you temporarily have two duplicate APIs. This isn't so bad until something urgent interrupts this refactoring, the duplication is forgotten or deprioritized, and you end up with a bunch of tech debt.



      But in the end, any solution will require you to coordinate with your team.






      share|improve this answer













      You have correctly understood that this is not so much a technical as a social problem: if you want to avoid excessive merge conflicts, the team needs to collaborate in a way that avoids these conflicts.



      This is part of a general problem with Git, in that branching is very easy but merging can still take a lot of effort. Development teams tend to launch a lot of branches and are then surprised that merging them is difficult, possibly because they are trying to emulate the Git Flow without understanding its context.



      The general rule to fast and easy merges is to prevent big differences from accumulating, in particular that feature branches should be very short lived (hours or days, not months). A development team that is able to rapidly integrate their changes will see fewer merge conflicts. If some code isn't yet production ready, it might be possible to integrate it but deactivate it through a feature flag. As soon as the code has been integrated into your master branch, it becomes accessible to the kind of refactoring you are trying to do.



      That might be too much for your immediate problem. But it may be feasible to ask colleagues to merge their changes that impact this file until the end of the week so that you can perform the refactoring. If they wait longer, they'll have to deal with the merge conflicts themselves. That's not impossible, it's just avoidable work.



      You may also want to prevent large swaths of dependent code by making API-compatible changes. For example, if you want to extract some functionality into a separate module:



      1. Extract the functionality into a separate module.

      2. Change the old functions to forward their calls to the new API.

      3. Over time, port dependent code to the new API.

      4. Finally, you can delete the old functions.

      This multi-step process can avoid many merge conflicts. In particular, there will only be conflicts if someone else is also changing the functionality you extracted. The cost of this approach is that it's much slower than changing everything at once, and that you temporarily have two duplicate APIs. This isn't so bad until something urgent interrupts this refactoring, the duplication is forgotten or deprioritized, and you end up with a bunch of tech debt.



      But in the end, any solution will require you to coordinate with your team.







      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered 2 hours ago









      amonamon

      89.3k21170260




      89.3k21170260












      • So, if I got It right, the advice is smaller developments, frequent commits (push) and daily (to say something) merges. Right? In other words, to change the SDLC cadence

        – Laiv
        2 hours ago












      • @Laiv Unfortunately that is all extremely general advice, but some ideas out of the agile-ish space like Continuous Integration clearly have their merits. Teams that work together (and integrate their work frequently) will have an easier time making large cross-cutting changes than teams that only work alongside each other. This isn't necessarily about the SDLC at large, more about the collaboration within the team. Some approaches make working alongside more feasible (think Open/Closed Principle, microservices) but OP's team isn't there yet.

        – amon
        2 hours ago











      • If it's about collaboration. Would it be possible to get involved the team in the refactor? Seems to me that right now it's only one-dev's job. Multiple files of +4K LOC sounds like too much refactor for a single person to do. Or too much responsibility

        – Laiv
        2 hours ago







      • 1





        I wouldn't go so far as to say a feature branch needs to have a short lifetime -- merely that it should not diverge from its parent branch for long periods of time. Regularly merging changes from the parent branch into the feature branch works in those cases where the feature branch needs to stick around longer. Still, it's a good idea to keep feature branches around no longer than necessary.

        – Dan Lyons
        1 hour ago

















      • So, if I got It right, the advice is smaller developments, frequent commits (push) and daily (to say something) merges. Right? In other words, to change the SDLC cadence

        – Laiv
        2 hours ago












      • @Laiv Unfortunately that is all extremely general advice, but some ideas out of the agile-ish space like Continuous Integration clearly have their merits. Teams that work together (and integrate their work frequently) will have an easier time making large cross-cutting changes than teams that only work alongside each other. This isn't necessarily about the SDLC at large, more about the collaboration within the team. Some approaches make working alongside more feasible (think Open/Closed Principle, microservices) but OP's team isn't there yet.

        – amon
        2 hours ago











      • If it's about collaboration. Would it be possible to get involved the team in the refactor? Seems to me that right now it's only one-dev's job. Multiple files of +4K LOC sounds like too much refactor for a single person to do. Or too much responsibility

        – Laiv
        2 hours ago







      • 1





        I wouldn't go so far as to say a feature branch needs to have a short lifetime -- merely that it should not diverge from its parent branch for long periods of time. Regularly merging changes from the parent branch into the feature branch works in those cases where the feature branch needs to stick around longer. Still, it's a good idea to keep feature branches around no longer than necessary.

        – Dan Lyons
        1 hour ago
















      So, if I got It right, the advice is smaller developments, frequent commits (push) and daily (to say something) merges. Right? In other words, to change the SDLC cadence

      – Laiv
      2 hours ago






      So, if I got It right, the advice is smaller developments, frequent commits (push) and daily (to say something) merges. Right? In other words, to change the SDLC cadence

      – Laiv
      2 hours ago














      @Laiv Unfortunately that is all extremely general advice, but some ideas out of the agile-ish space like Continuous Integration clearly have their merits. Teams that work together (and integrate their work frequently) will have an easier time making large cross-cutting changes than teams that only work alongside each other. This isn't necessarily about the SDLC at large, more about the collaboration within the team. Some approaches make working alongside more feasible (think Open/Closed Principle, microservices) but OP's team isn't there yet.

      – amon
      2 hours ago





      @Laiv Unfortunately that is all extremely general advice, but some ideas out of the agile-ish space like Continuous Integration clearly have their merits. Teams that work together (and integrate their work frequently) will have an easier time making large cross-cutting changes than teams that only work alongside each other. This isn't necessarily about the SDLC at large, more about the collaboration within the team. Some approaches make working alongside more feasible (think Open/Closed Principle, microservices) but OP's team isn't there yet.

      – amon
      2 hours ago













      If it's about collaboration. Would it be possible to get involved the team in the refactor? Seems to me that right now it's only one-dev's job. Multiple files of +4K LOC sounds like too much refactor for a single person to do. Or too much responsibility

      – Laiv
      2 hours ago






      If it's about collaboration. Would it be possible to get involved the team in the refactor? Seems to me that right now it's only one-dev's job. Multiple files of +4K LOC sounds like too much refactor for a single person to do. Or too much responsibility

      – Laiv
      2 hours ago





      1




      1





      I wouldn't go so far as to say a feature branch needs to have a short lifetime -- merely that it should not diverge from its parent branch for long periods of time. Regularly merging changes from the parent branch into the feature branch works in those cases where the feature branch needs to stick around longer. Still, it's a good idea to keep feature branches around no longer than necessary.

      – Dan Lyons
      1 hour ago





      I wouldn't go so far as to say a feature branch needs to have a short lifetime -- merely that it should not diverge from its parent branch for long periods of time. Regularly merging changes from the parent branch into the feature branch works in those cases where the feature branch needs to stick around longer. Still, it's a good idea to keep feature branches around no longer than necessary.

      – Dan Lyons
      1 hour ago













      2














      You are thinking of splitting the file as an atomic operation, but there are intermediate changes you can make. The file gradually became huge over time, it can gradually become small over time.



      Pick a part that hasn't had to change in a long time (git blame can help with this), and split that off first. Get that change merged into everyone's branches, then pick the next easiest part to split. Maybe even splitting one part is too big a step and you should just do some rearranging within the large file first.



      If people aren't frequently merging back to develop, you should encourage that, then after they merge, take that opportunity to split off the parts they just changed. Or ask them to do the splitting off as part of the pull request review.



      The idea is to slowly move toward your goal. It will feel like progress is slow, but then suddenly you'll realize your code is a lot better. It takes a long time to turn an ocean liner.






      share|improve this answer



























        2














        You are thinking of splitting the file as an atomic operation, but there are intermediate changes you can make. The file gradually became huge over time, it can gradually become small over time.



        Pick a part that hasn't had to change in a long time (git blame can help with this), and split that off first. Get that change merged into everyone's branches, then pick the next easiest part to split. Maybe even splitting one part is too big a step and you should just do some rearranging within the large file first.



        If people aren't frequently merging back to develop, you should encourage that, then after they merge, take that opportunity to split off the parts they just changed. Or ask them to do the splitting off as part of the pull request review.



        The idea is to slowly move toward your goal. It will feel like progress is slow, but then suddenly you'll realize your code is a lot better. It takes a long time to turn an ocean liner.






        share|improve this answer

























          2












          2








          2







          You are thinking of splitting the file as an atomic operation, but there are intermediate changes you can make. The file gradually became huge over time, it can gradually become small over time.



          Pick a part that hasn't had to change in a long time (git blame can help with this), and split that off first. Get that change merged into everyone's branches, then pick the next easiest part to split. Maybe even splitting one part is too big a step and you should just do some rearranging within the large file first.



          If people aren't frequently merging back to develop, you should encourage that, then after they merge, take that opportunity to split off the parts they just changed. Or ask them to do the splitting off as part of the pull request review.



          The idea is to slowly move toward your goal. It will feel like progress is slow, but then suddenly you'll realize your code is a lot better. It takes a long time to turn an ocean liner.






          share|improve this answer













          You are thinking of splitting the file as an atomic operation, but there are intermediate changes you can make. The file gradually became huge over time, it can gradually become small over time.



          Pick a part that hasn't had to change in a long time (git blame can help with this), and split that off first. Get that change merged into everyone's branches, then pick the next easiest part to split. Maybe even splitting one part is too big a step and you should just do some rearranging within the large file first.



          If people aren't frequently merging back to develop, you should encourage that, then after they merge, take that opportunity to split off the parts they just changed. Or ask them to do the splitting off as part of the pull request review.



          The idea is to slowly move toward your goal. It will feel like progress is slow, but then suddenly you'll realize your code is a lot better. It takes a long time to turn an ocean liner.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 1 hour ago









          Karl BielefeldtKarl Bielefeldt

          120k32215413




          120k32215413





















              2














              Do the refactoring in smaller steps. Lets say your large file has the name Foo:



              1. Add a new empty file Bar - commit it to "trunk".


              2. Find a small portion of the code in Foo which can be moved over to Bar. Apply the move, update from trunk, build and test the code, and commit to "trunk".


              3. Repeat step 2 until Foo and Bar have equal size (or whatever size you prefer)


              That way, next time your team mates update their branches from trunk, they get your changes in "small portions" and can merge them one-by-one, which is a lot easier than having to merge a full split in one step. Same holds when in step 2 you get a merge conflict because someone else in between updated trunk.



              This won't eliminate merge conflicts, but it restricts each conflict to a small area of code, which is way more manageable.



              And of course - communicate the refactoring in the team. Inform your mates what you are doing, so they know why they have to expect merge conflicts for the particular file.






              share|improve this answer





























                2














                Do the refactoring in smaller steps. Lets say your large file has the name Foo:



                1. Add a new empty file Bar - commit it to "trunk".


                2. Find a small portion of the code in Foo which can be moved over to Bar. Apply the move, update from trunk, build and test the code, and commit to "trunk".


                3. Repeat step 2 until Foo and Bar have equal size (or whatever size you prefer)


                That way, next time your team mates update their branches from trunk, they get your changes in "small portions" and can merge them one-by-one, which is a lot easier than having to merge a full split in one step. Same holds when in step 2 you get a merge conflict because someone else in between updated trunk.



                This won't eliminate merge conflicts, but it restricts each conflict to a small area of code, which is way more manageable.



                And of course - communicate the refactoring in the team. Inform your mates what you are doing, so they know why they have to expect merge conflicts for the particular file.






                share|improve this answer



























                  2












                  2








                  2







                  Do the refactoring in smaller steps. Lets say your large file has the name Foo:



                  1. Add a new empty file Bar - commit it to "trunk".


                  2. Find a small portion of the code in Foo which can be moved over to Bar. Apply the move, update from trunk, build and test the code, and commit to "trunk".


                  3. Repeat step 2 until Foo and Bar have equal size (or whatever size you prefer)


                  That way, next time your team mates update their branches from trunk, they get your changes in "small portions" and can merge them one-by-one, which is a lot easier than having to merge a full split in one step. Same holds when in step 2 you get a merge conflict because someone else in between updated trunk.



                  This won't eliminate merge conflicts, but it restricts each conflict to a small area of code, which is way more manageable.



                  And of course - communicate the refactoring in the team. Inform your mates what you are doing, so they know why they have to expect merge conflicts for the particular file.






                  share|improve this answer















                  Do the refactoring in smaller steps. Lets say your large file has the name Foo:



                  1. Add a new empty file Bar - commit it to "trunk".


                  2. Find a small portion of the code in Foo which can be moved over to Bar. Apply the move, update from trunk, build and test the code, and commit to "trunk".


                  3. Repeat step 2 until Foo and Bar have equal size (or whatever size you prefer)


                  That way, next time your team mates update their branches from trunk, they get your changes in "small portions" and can merge them one-by-one, which is a lot easier than having to merge a full split in one step. Same holds when in step 2 you get a merge conflict because someone else in between updated trunk.



                  This won't eliminate merge conflicts, but it restricts each conflict to a small area of code, which is way more manageable.



                  And of course - communicate the refactoring in the team. Inform your mates what you are doing, so they know why they have to expect merge conflicts for the particular file.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited 12 mins ago

























                  answered 1 hour ago









                  Doc BrownDoc Brown

                  136k23251403




                  136k23251403





















                      0














                      Wait until hometime. Split the file, commit and merge to master.



                      Other people will have to pull the changes into their feature branches in the morning like any other change.






                      share|improve this answer























                      • Still would mean they would have to merge my refactorings with their changes though...

                        – Hoff
                        2 hours ago











                      • somewhat related: suggestion about uncluttering file structure

                        – Nick Alexeev
                        2 hours ago












                      • they are going to have to merge that big file with one another anyway. merging with your split version might actually reduce the total pain

                        – Ewan
                        2 hours ago











                      • Well, they actually have to deal with merges anyways if they all are changing these files.

                        – Laiv
                        2 hours ago
















                      0














                      Wait until hometime. Split the file, commit and merge to master.



                      Other people will have to pull the changes into their feature branches in the morning like any other change.






                      share|improve this answer























                      • Still would mean they would have to merge my refactorings with their changes though...

                        – Hoff
                        2 hours ago











                      • somewhat related: suggestion about uncluttering file structure

                        – Nick Alexeev
                        2 hours ago












                      • they are going to have to merge that big file with one another anyway. merging with your split version might actually reduce the total pain

                        – Ewan
                        2 hours ago











                      • Well, they actually have to deal with merges anyways if they all are changing these files.

                        – Laiv
                        2 hours ago














                      0












                      0








                      0







                      Wait until hometime. Split the file, commit and merge to master.



                      Other people will have to pull the changes into their feature branches in the morning like any other change.






                      share|improve this answer













                      Wait until hometime. Split the file, commit and merge to master.



                      Other people will have to pull the changes into their feature branches in the morning like any other change.







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered 3 hours ago









                      EwanEwan

                      42.6k33594




                      42.6k33594












                      • Still would mean they would have to merge my refactorings with their changes though...

                        – Hoff
                        2 hours ago











                      • somewhat related: suggestion about uncluttering file structure

                        – Nick Alexeev
                        2 hours ago












                      • they are going to have to merge that big file with one another anyway. merging with your split version might actually reduce the total pain

                        – Ewan
                        2 hours ago











                      • Well, they actually have to deal with merges anyways if they all are changing these files.

                        – Laiv
                        2 hours ago


















                      • Still would mean they would have to merge my refactorings with their changes though...

                        – Hoff
                        2 hours ago











                      • somewhat related: suggestion about uncluttering file structure

                        – Nick Alexeev
                        2 hours ago












                      • they are going to have to merge that big file with one another anyway. merging with your split version might actually reduce the total pain

                        – Ewan
                        2 hours ago











                      • Well, they actually have to deal with merges anyways if they all are changing these files.

                        – Laiv
                        2 hours ago

















                      Still would mean they would have to merge my refactorings with their changes though...

                      – Hoff
                      2 hours ago





                      Still would mean they would have to merge my refactorings with their changes though...

                      – Hoff
                      2 hours ago













                      somewhat related: suggestion about uncluttering file structure

                      – Nick Alexeev
                      2 hours ago






                      somewhat related: suggestion about uncluttering file structure

                      – Nick Alexeev
                      2 hours ago














                      they are going to have to merge that big file with one another anyway. merging with your split version might actually reduce the total pain

                      – Ewan
                      2 hours ago





                      they are going to have to merge that big file with one another anyway. merging with your split version might actually reduce the total pain

                      – Ewan
                      2 hours ago













                      Well, they actually have to deal with merges anyways if they all are changing these files.

                      – Laiv
                      2 hours ago






                      Well, they actually have to deal with merges anyways if they all are changing these files.

                      – Laiv
                      2 hours ago











                      Hoff is a new contributor. Be nice, and check out our Code of Conduct.









                      draft saved

                      draft discarded


















                      Hoff is a new contributor. Be nice, and check out our Code of Conduct.












                      Hoff is a new contributor. Be nice, and check out our Code of Conduct.











                      Hoff is a new contributor. Be nice, and check out our Code of Conduct.














                      Thanks for contributing an answer to Software Engineering Stack Exchange!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsoftwareengineering.stackexchange.com%2fquestions%2f389380%2fwhats-the-best-way-to-handle-refactoring-a-big-file%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Era Viking Índice Início da Era Viquingue | Cotidiano | Sociedade | Língua | Religião | A arte | As primeiras cidades | As viagens dos viquingues | Viquingues do Oeste e Leste | Fim da Era Viquingue | Fontes históricas | Referências Bibliografia | Ligações externas | Menu de navegação«Sverige då!»«Handel I vikingetid»«O que é Nórdico Antigo»Mito, magia e religião na volsunga saga Um olhar sobre a trajetória mítica do herói sigurd«Bonden var den verklige vikingen»«Vikingatiden»«Vikingatiden»«Vinland»«Guerreiras de Óðinn: As Valkyrjor na Mitologia Viking»1519-9053«Esculpindo símbolos e seres: A arte viking em pedras rúnicas»1679-9313Historia - Tema: VikingarnaAventura e Magia no Mundo das Sagas IslandesasEra Vikinge

                      What's the metal clinking sound at the end of credits in Avengers: Endgame?What makes Thanos so strong in Avengers: Endgame?Who is the character that appears at the end of Endgame?What happens to Mjolnir (Thor's hammer) at the end of Endgame?The People's Ages in Avengers: EndgameWhat did Nebula do in Avengers: Endgame?Messing with time in the Avengers: Endgame climaxAvengers: Endgame timelineWhat are the time-travel rules in Avengers Endgame?Why use this song in Avengers: Endgame Opening Logo Sequence?Peggy's age in Avengers Endgame

                      Are there legal definitions of ethnicities/races? The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)Legal definitions in the United StatesAre there truly legal limits on US interest rates?Are gender identity and sexual orientation federally protected?Why is there an apparent legal bias against digital services?What limits are there to the powers of individual judges in the United States legal system?Are women only scholarships legal under Irish / EU law?Is the term “race” defined by Public Law enacted by Congress of the United StatesIs there a legal definition of race in the US?Neighbors are spying for landlord on Renters is it legal?Are Protected Classes Bi-directional?